【发布时间】:2017-05-19 15:35:29
【问题描述】:
表 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 关联的出院原因。不仅有两种类型,但我以 A 和 B 为例
所需的输出:
+-------------+-----------+------------+------------------+
| 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 列,因为外部相关子查询上的 INNER JOIN 用于获取 Max Edate 和关联的 Discharge Reason,导致查询忽略 Type=A,因此没有 Startdates。我如何使这些协同工作?
【问题讨论】:
-
请编辑您的问题以在 弗拉迪默的回答。因为在您的问题中,您特别提到 Type=[A, B] 好像这些是唯一的选择。
标签: sql sql-server sql-server-2012 greatest-n-per-group window-functions