日期:2014-05-18 浏览次数:20637 次
;WITH t1
AS
(
SELECT
a.ID,a.train_no,a.station_name,b.num
FROM
(SELECT a.*,b.train_no FROM A,(SELECT DISTINCT train_no FROM B) AS B) AS a
LEFT JOIN B ON a.train_no=b.train_no AND a.station_name=b.station_name
)
SELECT
a.train_no,a.station_name,ISNULL(a.num,b.num) AS num
FROM t1 AS a
CROSS APPLY
(SELECT TOP 1 num FROM t1 WHERE ID<a.ID AND num IS NOT null ORDER BY ID desc) AS b
------解决方案--------------------
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([id] INT,[station_name] VARCHAR(4))
INSERT [ta]
SELECT 1,'南京' UNION ALL
SELECT 2,'镇江' UNION ALL
SELECT 3,'丹阳' UNION ALL
SELECT 4,'常州' UNION ALL
SELECT 5,'无锡' UNION ALL
SELECT 6,'苏州' UNION ALL
SELECT 7,'上海'
--------------开始查询--------------------------
SELECT * FROM [ta]
----------------结果----------------------------
/*
*/
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([train_no] VARCHAR(5),[station_name] VARCHAR(4),[num] INT)
INSERT [tb]
SELECT 'G7001','南京',287 UNION ALL
SELECT 'G7001','常州',391 UNION ALL
SELECT 'G7001','无锡',485 UNION ALL
SELECT 'G7001','苏州',576 UNION ALL
SELECT 'G7001','上海',576 UNION ALL
SELECT 'G7003','南京',342 UNION ALL
SELECT 'G7003','苏州',407 UNION ALL
SELECT 'G7003','上海',407
--------------开始查询--------------------------
;WITH cte
AS (
SELECT a.[id], a.[station_name], b.[train_no], c.[num]
FROM [ta] AS a
CROSS JOIN (
SELECT DISTINCT
[train_no]
FROM [tb]
) AS b
OUTER APPLY (
SELECT [num] FROM tb WHERE [station_name]= a.[station_name] AND [train_no]= b.[train_no]
) c
)
SELECT [id], [station_name], [train_no], [num] = ISNULL([num], (
SELECT TOP 1 [num] FROM cte WHERE [train_no]= t.[train_no] AND [id]< t.[id]
))
FROM cte AS t
ORDER BY t.[train_no], t.[id]
/*
id station_name train_no num
----------- ------------ -------- -----------
1 南京 G7001 287
2 镇江 G7001 287
3 丹阳 G7001 287
4 常州 G7001 391
5 无锡 G7001 485
6 苏州 G7001 576
7 上海 G7001 576
1 南京 G7003 342
2 镇江 G7003 342
3 丹阳 G7003 342
4 常州 G7003 342
5 无锡 G7003 342
6 苏州 G7003 407
7 上海 G7003 407
(14 行受影响)
*/