2014-01-29 68 views
0

我有一個名爲EVENTS的表,我需要編寫4個腳本來生成4個獨立的EVENT_ID值不同的表。下面是第一個腳本,其他3個將具有類似的邏輯。任何人都可以幫助這個第一個腳本,所以我希望可以用它作爲其他3個腳本的模板。我在SQL2005中編寫這些腳本,這些腳本必須向後兼容SQL2000。我已經刪除了任何重複項,所以不應該有必要在邏輯中涉及EVENT_ID的排名。基於相關MIN()和MAX()值的不同值

對於每個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 
+0

你能發佈你期望的結果嗎? – TTeeple

回答

2

使用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的最大日期。我認爲this會讓你走上正軌!

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'); 

編輯3Now with proper 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'); 
+0

不知道這工作,因爲我希望看到EVENT_ID 93名單CARE_ID 107,因爲它滿足了條件,但它不存在? –

+0

我沒有看到一個EVENT_ID爲93的EVENT_TYPE,除了'CP'之外的任何東西 - 根據我的理解,這似乎沒有滿足要求,因爲沒有'B','CH'的記錄, 'S','T'。如果需要,你可以將條件包裝在ISNULL中,但你可能會進一步提供一些樣本輸出......哦,我明白了。看我的編輯! – Avarkx

+0

CARE_ID 107具有23/02/2010的MAX(EVENT_DATE),其中EVENT_TYPE是'CP' - 這是EVENT_ID 93.該MAX(EVENT_DATE)在21/09/2012的MIN(EVENT_DATE)之前從EVENT_TYPE IN('B','CH','S','T')的事件 - 這將是EVENT_ID 1474.希望澄清並感謝您的意見。 –

1

這翻譯相當直接進入使用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.如果它的工作,那麼你可以用子查詢替換窗口函數。

+0

此腳本返回語法錯誤,因爲在select語句中使用了聚合,並且子查詢中由*表示的列不在GROUP BY子句中 –

+0

*'window functions'*?這是使用窗口功能? –

+0

@AndriyM。 。 。他們在我心中;現在我已經修好了,所以他們也在回答。謝謝! –