none
根据原始数据表核算公交车次问题 RRS feed

  • 问题

  • 如图,我接到一个核算公交车跑的趟次的问题,司机会在两个终点站刷卡,核算车次的条件是两个不同终点站最近的俩个时间默认为一个车次,每次刷卡只代表是出站或进站,也就是发车和收车。如上表所示东终点发车6:35 收车是西终点7:50,这是一个车次。下一个车次是西终点发7:58,收车是东终点的8:50
    生成车次汇总表为
    线路 车号 工号 车次(整形)
    1      1    1    2

    看各位高手这个SQL语句如何写呢,上图表是设备原始生成表。需要求出车次、


    csarp,china,usa

    • 已移动 ThankfulHeart 2012年11月23日 4:39 SQL查询问题 (发件人:Visual C#)
    2012年11月22日 12:25

答案

  • -- 示例数据
    DECLARE @tb TABLE(
    	线路 int, 车号 int, 工号 int,
    	发车时间 datetime,
    	终点站 nvarchar(10)
    );
    INSERT @tb
    VALUES
    (1, 1, 1, '06:30', N'东站点'),
    (1, 1, 1, '06:35', N'东站点'),
    (1, 1, 1, '07:50', N'西站点'),
    (1, 1, 1, '07:55', N'西站点'),
    (1, 1, 1, '07:58', N'西站点'),
    (1, 1, 1, '08:50', N'东站点')
    ;
    -- 查询
    SELECT
    	A.线路, A.车号, A.工号,
    	A.发车时间,
    	起点站 = A.终点站,
    	收车时间 = B.发车时间,
    	B.终点站
    FROM @tb A
    	CROSS APPLY(
    		SELECT TOP 1 
    			*
    		from @tb BB
    		WHERE BB.线路 = A.线路
    			AND BB.车号 = A.车号
    			AND BB.工号 = A.工号
    			AND BB.终点站 <> A.终点站	-- 最近一条站名不同的记录
    			AND BB.发车时间 > A.发车时间
    		ORDER BY BB.发车时间
    	)B
    WHERE NOT EXISTS(
    		SELECT *
    		FROM @tb CC
    		WHERE CC.线路 = A.线路
    			AND CC.车号 = A.车号
    			AND CC.工号 = A.工号
    			AND CC.终点站 = A.终点站
    			AND CC.发车时间 > A.发车时间
    			AND CC.发车时间 < B.发车时间
    	)

    • 已标记为答案 chunze 2012年11月24日 10:51
    2012年11月23日 5:20

全部回复

  • -- 示例数据
    DECLARE @tb TABLE(
    	线路 int, 车号 int, 工号 int,
    	发车时间 datetime,
    	终点站 nvarchar(10)
    );
    INSERT @tb
    VALUES
    (1, 1, 1, '06:30', N'东站点'),
    (1, 1, 1, '06:35', N'东站点'),
    (1, 1, 1, '07:50', N'西站点'),
    (1, 1, 1, '07:55', N'西站点'),
    (1, 1, 1, '07:58', N'西站点'),
    (1, 1, 1, '08:50', N'东站点')
    ;
    -- 查询
    SELECT
    	A.线路, A.车号, A.工号,
    	A.发车时间,
    	起点站 = A.终点站,
    	收车时间 = B.发车时间,
    	B.终点站
    FROM @tb A
    	CROSS APPLY(
    		SELECT TOP 1 
    			*
    		from @tb BB
    		WHERE BB.线路 = A.线路
    			AND BB.车号 = A.车号
    			AND BB.工号 = A.工号
    			AND BB.终点站 <> A.终点站	-- 最近一条站名不同的记录
    			AND BB.发车时间 > A.发车时间
    		ORDER BY BB.发车时间
    	)B
    WHERE NOT EXISTS(
    		SELECT *
    		FROM @tb CC
    		WHERE CC.线路 = A.线路
    			AND CC.车号 = A.车号
    			AND CC.工号 = A.工号
    			AND CC.终点站 = A.终点站
    			AND CC.发车时间 > A.发车时间
    			AND CC.发车时间 < B.发车时间
    	)

    • 已标记为答案 chunze 2012年11月24日 10:51
    2012年11月23日 5:20
  • 关注一下


    给我写信: QQ我:点击这里给我发消息

    2012年11月23日 6:39
  • 谢谢,希望看到您的代码真的很感谢,发帖后用c#数组搞定这一问题,但是想问问导入数组后处理是否比直接用SQL处理效率底很多呢?

    csarp,china,usa

    2012年11月24日 10:53
  • 复杂逻辑的话当然用C#好,至于效率个人觉得用C#反而有优势,如果逻辑很复杂的话


    给我写信: QQ我:点击这里给我发消息

    2012年11月24日 15:38