首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Server中的单个列查找源/目标

基于Server中的单个列查找源/目标
EN

Stack Overflow用户
提问于 2017-12-21 10:26:00
回答 2查看 1.3K关注 0票数 2

我有一个具有以下数据的Server表

代码语言:javascript
运行
复制
ID  Source     Destination  PFID
1   Loc X      Loc Y        1
2   Loc Y      Loc Z        1
3   Delhi      Kolkata      3
4   Kolkata    Dhaka        3

上表存储了不同城市之间的航班数据。我想要一个如下格式的结果-

代码语言:javascript
运行
复制
Source     Destination  PFID
Loc X      Loc Z        1
Delhi      Dhanka       3

请就如何实现这一目标提出建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-21 10:39:05

只需在条件聚合中使用group by子句

代码语言:javascript
运行
复制
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()函数直接获取源站和目标站。

代码语言:javascript
运行
复制
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提供的数据进行的。

票数 2
EN

Stack Overflow用户

发布于 2017-12-21 10:34:27

尝试以下几点

代码语言:javascript
运行
复制
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_VALUELAST_VALUE支持窗口函数,则可以使用它们

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
;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和我的第一个查询

代码语言:javascript
运行
复制
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.DestinationID
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47922855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档