T-SQL: использование OVER и PARTITION BY - PullRequest
5 голосов
/ 25 марта 2010

У меня есть следующие данные

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 01.01.2010
 |   1    |  20   | 02.01.2010
 |   1    |  30   | 03.01.2010
 |   1    |  40   | 04.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 10.01.2010
 |   2    |  30   | 04.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 07.01.2010
 |   2    |  80   | 08.01.2010
 |   2    |  100  | 09.01.2010

И следующее утверждение

SELECT   Item, Value, MIN(Date) OVER (PARTITION BY Item) 
FROM     Data
WHERE    Value >= 50   

И я получаю следующий результат

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 05.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 06.01.2010
 |   2    |  80   | 06.01.2010
 |   2    |  100  | 06.01.2010

Но мне нужно это

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 05.01.2010
 |   1    |  20   | 05.01.2010
 |   1    |  30   | 05.01.2010
 |   1    |  40   | 05.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 05.01.2010
 |   2    |  30   | 06.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 06.01.2010
 |   2    |  80   | 06.01.2010
 |   2    |  100  | 06.01.2010

Есть ли какое-нибудь быстрое решение, чтобы получить это с одним статусом без самостоятельного соединения?

Спасибо:)

1 Ответ

4 голосов
/ 25 марта 2010

без самостоятельного объединения, попробуйте это:

DECLARE @YourTable table (item int,value int, Date datetime)
INSERT @YourTable VALUES (1    ,  10   , '01/01/2010')
INSERT @YourTable VALUES (1    ,  20   , '02/01/2010')
INSERT @YourTable VALUES (1    ,  30   , '03/01/2010')
INSERT @YourTable VALUES (1    ,  40   , '04/01/2010')
INSERT @YourTable VALUES (1    ,  50   , '05/01/2010')
INSERT @YourTable VALUES (1    ,  80   , '10/01/2010')
INSERT @YourTable VALUES (2    ,  30   , '04/01/2010')
INSERT @YourTable VALUES (2    ,  60   , '06/01/2010')
INSERT @YourTable VALUES (2    ,  70   , '07/01/2010')
INSERT @YourTable VALUES (2    ,  80   , '08/01/2010')
INSERT @YourTable VALUES (2    ,  100  , '09/01/2010')


SELECT   Item, Value, MIN(CASE WHEN Value >= 50 THEN Date ELSE NULL END) OVER (PARTITION BY Item) 
FROM     @YourTable

ВЫВОД:

Item        Value       
----------- ----------- -----------------------
1           10          2010-05-01 00:00:00.000
1           20          2010-05-01 00:00:00.000
1           30          2010-05-01 00:00:00.000
1           40          2010-05-01 00:00:00.000
1           50          2010-05-01 00:00:00.000
1           80          2010-05-01 00:00:00.000
2           30          2010-06-01 00:00:00.000
2           60          2010-06-01 00:00:00.000
2           70          2010-06-01 00:00:00.000
2           80          2010-06-01 00:00:00.000
2           100         2010-06-01 00:00:00.000
Warning: Null value is eliminated by an aggregate or other SET operation.

(11 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...