我有一个具有以下数据的Server表
ID Source Destination PFID
1 Loc X Loc Y 1
2 Loc Y Loc Z 1
3 Delhi Kolkata 3
4 Kolkata Dhaka 3上表存储了不同城市之间的航班数据。我想要一个如下格式的结果-
Source Destination PFID
Loc X Loc Z 1
Delhi Dhanka 3请就如何实现这一目标提出建议。
发布于 2017-12-21 10:39:05
只需在条件聚合中使用group by子句
select min(case when pfid = id then Source end) [Source],
max(case when pfid <> id then Destination end) [Destination], PFID
from table
group by PFID编辑:
您还可以使用first_value()和last_value()函数直接获取源站和目标站。
select distinct first_value(Source) over (partition by PFID order by PFID) , last_value(Destination) over (partition by PFID order by PFID), PFID
from table
order by PFID注:以上测试是根据Q提供的数据进行的。
发布于 2017-12-21 10:34:27
尝试以下几点
SELECT q.PFID,p1.Source,p2.Destination
FROM
(
SELECT PFID,MIN(ID) SourceID,MAX(ID) DestinationID
FROM [Your Table]
GROUP BY PFID
) q
JOIN [Your Table] p1 ON p1.ID=q.SourceID
JOIN [Your Table] p2 ON p2.ID=q.DestinationID或者,如果您的版本的FIRST_VALUE和LAST_VALUE支持窗口函数,则可以使用它们
SELECT DISTINCT
PFID,
FIRST_VALUE(Source)OVER(PARTITION BY PFID ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Source,
LAST_VALUE(Destination)OVER(PARTITION BY PFID ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Destination
FROM [Your Table]如果ID不一致,则可以使用递归CTE
;WITH cte AS(
-- start point
SELECT ID,Source,Destination,PFID,1 step
FROM [Your Table]
WHERE PFID=ID
UNION ALL
-- next point
SELECT t.ID,c.Source,t.Destination,t.PFID,c.step+1
FROM [Your Table] t
JOIN cte c ON t.Source=c.Destination
)
SELECT PFID,Source,Destination
FROM
(
SELECT
PFID,
Source,
Destination,
step,
MAX(step)OVER(PARTITION BY PFID) LastStep
FROM cte
) q
WHERE step=LastStep这是两个查询的共生关系,提供了Yogesh Sharma和我的第一个查询
SELECT s.PFID,s.Source,d.Destination
FROM
(
SELECT PFID,MIN(CASE WHEN PFID=ID THEN Source END) Source,MAX(ID) DestinationID
FROM [Your Table]
GROUP BY PFID
) s
JOIN [Your Table] d ON d.ID=s.DestinationIDhttps://stackoverflow.com/questions/47922855
复制相似问题