表T1
+----+------------+------------+--------+------+
| ID | Sdate | Edate | Reason | Type |
+----+------------+------------+--------+------+
| 1 | 5/30/2016 | | | A |
| 1 | 1/19/2016 | 12/15/2016 | USD | B |
| 1 | 11/20/2016 | 10/1/2016 | IT | B |
| 2 | 10/25/2016 | | | A |
| 2 | 9/22/2016 | 7/11/2016 | SD | B |
| 2 | 2/13/2016 | | | A |
| 2 | 1/1/2016 | 4/3/2016 | IT | B |
+----+------------+------------+--------+------+
对于每个ID,我需要为Type = A选择最小Sdate,为Type = B选择最大Edate,以及与Type = B关联的Discharge Reason . 不仅仅有两种类型,但我以A和B为例
Desired Output:
+-------------+-----------+------------+------------------+
| Customer ID | Startdate | Enddate | Discharge Reason |
+-------------+-----------+------------+------------------+
| 1 | 5/30/2016 | 12/15/2016 | USD |
| 2 | 2/13/2016 | 7/11/2016 | SD |
+-------------+-----------+------------+------------------+
尝试:
WITH CTE AS
(
SELECT
ID
,SDate
,EDate
,Reason
,Type
FROM T1
)
SELECT
CTE.ID AS [Customer ID]
,MIN(CASE WHEN CTE.Type='A' THEN CTE.SDate END)
OVER (PARTITION BY CTE.CID) AS StartDate
,CTE.EDate AS Enddate
,CTE.Reason AS [Discharge Reason]
FROM CTE
INNER JOIN (SELECT CTE.ID, MAX(CTE.EDate) AS EEDate
FROM CTE WHERE CTE.Type='B' GROUP BY CTE.ID) CTE2
ON CTE.ID=CTE2.ID AND CTE.Edate=CTE2.EEDAte
这给了我一个空白的Startdate列,因为外部co-related子查询上的INNER JOIN用于获取Max Edate
和关联的 Discharge Reason
,导致查询忽略 Type=A
,因此没有Startdates . 我如何让这些工作在一起?
2 回答
这是一个经典的
top-n-per-group
问题,您需要做两次 .Sample data
对行进行两次编号 .
PARTITION BY ID ORDER BY Type, Sdate
将为每个ID
和最小的Sdate
和Type=A
提供行号1 .PARTITION BY ID ORDER BY Type DESC, Edate DESC
将为每个ID
和最大的Edate
和Type=B
提供行号1 .Intermediate result
现在我们需要获取
rnA=1
和rnB=1
的行,并将它们组合在一起ID
.Query
Result
你可以试试这个:
要么
如果有类型B没有重复的最大日期,如果有,你需要稍微调整一下 .