Как выбрать первую непрерывную группу строк, используя Oracle SQL - PullRequest
8 голосов
/ 24 июня 2010

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

Date             GroupID     Value 
1/01/2000    1                 44 
2/01/2000    1                 55 
3/01/2000    1                 66 
4/01/2000    2                 77 
5/01/2000    2                 88 
6/01/2000    1                 99 
7/01/2000    1                 22 

Я ищу запрос, способный выбрать первую группу записей с непрерывным идентификатором группы при заказе по дате. то есть в этом примере я получу:

1/01/2000    1                 44 
2/01/2000    1                 55 
3/01/2000    1                 66 

Поскольку идентификатор группы изменился в следующей строке, я не получил бы никаких последующих данных.

Помощь будет принята с благодарностью

Спасибо

Elie

Ответы [ 3 ]

9 голосов
/ 24 июня 2010

один способ сделать это:

SQL> WITH DATA AS (
  2  SELECT '1/01/2000' mydate, 1 GroupID, 44 Value FROM DUAL
  3  UNION ALL SELECT '2/01/2000', 1, 55 FROM DUAL
  4  UNION ALL SELECT '3/01/2000', 1, 66 FROM DUAL
  5  UNION ALL SELECT '4/01/2000', 2, 77 FROM DUAL
  6  UNION ALL SELECT '5/01/2000', 2, 88 FROM DUAL
  7  UNION ALL SELECT '6/01/2000', 1, 99 FROM DUAL
  8  UNION ALL SELECT '7/01/2000', 1, 22 FROM DUAL
  9  )
 10  SELECT mydate, groupid, VALUE
 11    FROM (SELECT mydate, groupid, VALUE,
 12                 SUM(gap) over(ORDER BY mydate) contiguous_group
 13             FROM (SELECT mydate, groupid, VALUE,
 14                           CASE
 15                              WHEN lag(groupid)
 16                                   over(ORDER BY mydate) != groupid
 17                              THEN
 18                               1
 19                              ELSE
 20                               0
 21                           END gap
 22                      FROM DATA))
 23   WHERE contiguous_group = 0;

MYDATE       GROUPID      VALUE
--------- ---------- ----------
1/01/2000          1         44
2/01/2000          1         55
3/01/2000          1         66
0 голосов
/ 28 августа 2013

Хоть уже и ответили, хотели бы поделиться.Он использует JOINs вместо

WITH DATA AS (
SELECT '1/01/2000' mydate, 1 GroupID, 44 v
UNION ALL SELECT '2/01/2000', 1, 55 
UNION ALL SELECT '3/01/2000', 1, 66 
UNION ALL SELECT '4/01/2000', 2, 77 
UNION ALL SELECT '5/01/2000', 2, 88 
UNION ALL SELECT '6/01/2000', 1, 99 
UNION ALL SELECT '7/01/2000', 1, 22 
) 

SELECT 
  a.GroupID,
  a.mydate
FROM 
  DATA a 
  JOIN DATA b ON ( b.mydate <= a.mydate )
GROUP BY 
  a.GroupID,
  a.mydate
HAVING 
  MAX( b.GroupID ) = MIN ( b.GroupID )
ORDER BY 
  a.mydate
0 голосов
/ 25 июня 2010

Это еще один способ, как это сделать

    WITH data AS
 (SELECT '1/01/2000' mydate,
         1 groupid,
         44 VALUE
    FROM dual
  UNION ALL
  SELECT '2/01/2000',
         1,
         55
    FROM dual
  UNION ALL
  SELECT '3/01/2000',
         1,
         66
    FROM dual
  UNION ALL
  SELECT '4/01/2000',
         2,
         77
    FROM dual
  UNION ALL
  SELECT '5/01/2000',
         2,
         88
    FROM dual
  UNION ALL
  SELECT '6/01/2000',
         1,
         99
    FROM dual
  UNION ALL
  SELECT '7/01/2000',
         1,
         22
    FROM dual)
SELECT *
  FROM data
 WHERE rownum <= (SELECT MAX(rwn)
                    FROM (SELECT COUNT(*) over(PARTITION BY groupid ORDER BY rownum) cnt,
                                 rownum rwn
                            FROM data)
                   WHERE rwn = cnt);

PS запрос от Vincent не будет работать, если все значения mydate будут одинаковыми

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