如何使用Oracle SQL选择第一个连续行组

如何使用Oracle SQL选择第一个连续行组,sql,oracle,Sql,Oracle,我有以下数据: 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

我有以下数据:

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 我正在寻找一个查询,当我按日期排序时,能够选择第一组具有连续GroupID的记录。i、 e.在这个例子中,我会得到:

1/01/2000 1 44 2/01/2000 1 55 3/01/2000 1 66 由于组ID在下一行中发生了更改,因此我无法获得任何后续数据

非常感谢您的帮助

谢谢

Elie

一种方法:

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

这是另一种方法

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

如果所有mydate值都相同,则Vincent的附加查询将不起作用

,尽管已得到答复,但希望共享。它使用连接


是否保证每个日期都有一张记录?谢谢你,非常有用谢谢你,非常有用
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