[英]Distinct values based on correlated MIN() and MAX() values
我有一個名為EVENTS的表,我需要編寫4個腳本來生成4個具有不同EVENT_ID值的單獨表。 下面是第一個腳本,其他三個腳本具有相似的邏輯。 任何人都可以在第一個腳本中提供幫助,以便我可以將其用作其他3個腳本的模板。 我正在SQL2005中編寫這些腳本,該腳本必須與SQL2000向后兼容。 我已刪除了所有重復項,因此無需在邏輯中包含EVENT_ID的等級。
對於每個CARE_ID,請選擇EVENT_ID的值,該值具有CP的EVENT_TYPE且MAX(EVENT_DATE)為<= MIN(EVENT_DATE),其中EVENT_TYPE處於('B','CH','S','T ')
CARE_ID EVENT_ID EVENT_DATE EVENT_TYPE
3 194 01/10/2012 S
3 228 07/07/2010 S
3 104 12/05/2010 CH
3 16 12/07/2010 B
3 17 13/07/2010 B
3 43 15/01/2010 P
3 189 15/04/2010 S
39 45 09/10/2009 T
39 4 21/07/2009 P
39 6 21/07/2009 CH
78 28 08/07/2009 S
78 706 08/12/2010 CP
78 707 09/12/2010 CP
78 9 28/07/2009 T
78 11 28/07/2009 CH
95 21 31/07/2009 CH
95 21 31/07/2009 T
107 1474 21/09/2012 S
107 93 23/02/2010 CP
107 59 29/10/2012 P
107 58 29/12/2009 P
151 186 19/03/2010 S
151 49 21/03/2010 T
152 69 26/08/2009 CH
206 85 21/08/2009 CP
206 84 28/07/2009 CP
217 158 18/02/2010 S
217 102 30/03/2010 CH
218 159 12/03/2010 S
227 1378 01/04/2011 CP
355 19 13/07/2010 B
355 20 13/07/2010 B
355 239 13/07/2010 S
355 56 16/07/2010 T
355 111 16/07/2010 CH
364 1136 18/02/2011 CP
364 569 19/02/2011 S
364 774 23/08/2012 CH
364 1122 26/01/2011 CP
367 247 01/07/2010 S
367 151 21/06/2010 CP
369 108 26/07/2010 P
369 152 27/07/2010 CP
369 109 28/07/2010 P
369 117 28/07/2010 CH
369 248 28/07/2010 S
380 277 08/07/2011 T
396 1573 06/06/2011 CP
481 63 07/09/2010 T
481 116 07/09/2010 P
481 194 07/09/2010 CP
481 289 07/09/2010 S
502 200 13/08/2010 CP
530 220 14/06/2010 CP
535 222 05/07/2010 CP
535 303 13/07/2010 S
535 223 19/07/2010 CP
535 224 26/07/2010 CP
536 135 10/09/2010 CH
536 225 23/08/2010 CP
568 155 06/10/2010 P
568 315 15/10/2010 S
631 148 02/02/2010 CH
631 74 15/01/2010 T
631 256 15/12/2009 CP
631 345 15/12/2009 S
631 147 25/12/2009 CH
632 259 18/09/2010 CP
653 189 29/10/2010 P
653 360 30/09/2010 S
655 1570 06/06/2011 CP
680 569 08/12/2010 CP
680 1191 24/11/2011 S
680 530 25/01/2011 S
680 151 30/09/2010 P
680 281 30/09/2010 CP
680 480 30/11/2010 CP
689 306 02/11/2010 CP
689 158 06/10/2010 P
689 372 06/10/2010 S
689 2720 06/11/2012 CP
689 2736 11/11/2012 CP
689 2752 13/11/2012 CP
689 2765 15/11/2012 CP
689 2125 22/09/2011 CP
689 2654 24/09/2012 CP
689 1944 26/08/2011 CP
689 307 26/10/2010 CP
689 1947 27/08/2011 CP
729 299 15/09/2010 CP
811 413 27/10/2010 S
834 622 01/01/2012 CH
834 1233 06/01/2012 S
834 624 15/01/2012 CH
834 625 23/01/2012 CH
834 627 23/01/2012 CH
838 629 02/01/2012 CH
838 630 20/01/2012 CH
838 632 27/01/2012 CH
846 416 05/10/2010 S
849 195 03/11/2010 P
849 336 21/02/2011 CP
923 441 26/07/2010 S
963 371 29/10/2010 CP
981 624 23/03/2011 S
984 384 13/11/2010 CP
984 392 18/11/2010 CP
嘗試使用HAVING
子句? 也許我搞砸了,但是您的測試數據似乎只有一個這樣的條目,即對於S
情況,如下所示:
SELECT e.[CARE_ID], e.[EVENT_ID]
FROM dbo.EVENTS e
WHERE e.[EVENT_TYPE] = 'CP'
GROUP BY e.[CARE_ID], e.[EVENT_ID]
HAVING MAX( e.[EVENT_DATE] ) <= ( SELECT MIN( [EVENT_DATE] )
FROM [EVENTS]
WHERE [EVENT_ID] = e.[EVENT_ID]
AND [EVENT_TYPE] = 'S' );
這是一個SQL Fiddle,可以幫助您解決問題!
編輯 :原始的小提琴正在尋找EVENT_ID
的最大日期,而我們應該在尋找CARE_ID
的最大日期。 我認為這將使您步入正軌!
SELECT e.[CARE_ID], e.[EVENT_ID]
FROM dbo.EVENTS e
WHERE e.[EVENT_TYPE] = 'CP'
GROUP BY e.[CARE_ID], e.[EVENT_ID]
HAVING MAX( e.[EVENT_DATE] ) <= ( SELECT MIN( [EVENT_DATE] )
FROM [EVENTS]
WHERE [CARE_ID] = e.[CARE_ID]
AND [EVENT_TYPE] = 'S' );
編輯3 : 現在以正確的DATETIME
!
編輯4 :不同的EVENT_ID
!
SELECT DISTINCT e.[EVENT_ID]
FROM dbo.EVENTS e
WHERE e.[EVENT_TYPE] = 'CP'
GROUP BY e.[CARE_ID], e.[EVENT_ID]
HAVING MAX( e.[EVENT_DATE] ) <= ( SELECT MIN( [EVENT_DATE] )
FROM dbo.[EVENTS]
WHERE [CARE_ID] = e.[CARE_ID]
AND [EVENT_TYPE] = 'S' );
使用窗口函數可以將其直接轉換為SQL:
select care_id, event_id
from (select e.*,
max(case when event_type = 'CP' then event_date end) over (partition by care_id) as MaxED_CP,
min(case when event_type = ('B','CH','S', 'T') then event_date end) over (partition by care_id) as MinED_others,
from events e
) e
where event_type = 'CP' and
MaxED_CP <= MinED_others and
event_date = MaxED_CP;
這些函數計算每一行的max()
和min()
值。 外部查詢僅選擇適當的行。
請注意,如果對於給定的care_id
不存在此類事件,則care_id
不在輸出中。
這與SQL Server 2000向后不兼容。如果可以,則可以將窗口函數替換為子查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.