繁体   English   中英

ORACLE GROUP BY with Date 分组不正确

[英]ORACLE GROUP BY with Date does not group correctly

我尝试按日期对给定的表进行分组以获得成员 ID 的最小和最大日期。 结果应显示一个时间范围,从成员何时成为 OE 的一部分。

我给定的表(摘录):

ID  DATE                OE
11  2021-03-06 00:00:00 2926
11  2021-03-07 00:00:00 3879
11  2021-03-08 00:00:00 3879
11  2021-03-09 00:00:00 3879
11  2021-03-10 00:00:00 2926
11  2021-03-11 00:00:00 2926
11  2021-03-12 00:00:00 2926
11  2021-03-13 00:00:00 2926
11  2021-03-14 00:00:00 2926
11  2021-03-15 00:00:00 2926
11  2021-03-16 00:00:00 1344
11  2021-03-17 00:00:00 1344
11  2021-03-18 00:00:00 1344
11  2021-03-19 00:00:00 1344
11  2021-03-20 00:00:00 1344
11  2021-03-21 00:00:00 1344
11  2021-03-22 00:00:00 2926
11  2021-03-23 00:00:00 2926
11  2021-03-24 00:00:00 2926
11  2021-03-25 00:00:00 2926
11  2021-03-26 00:00:00 2926
11  2021-03-27 00:00:00 2926
11  2021-03-28 00:00:00 2926
11  2021-03-29 00:00:00 2926
11  2021-03-30 00:00:00 2926
11  2021-03-31 00:00:00 2926
11  2021-04-01 00:00:00 1549
11  2021-04-02 00:00:00 1549
11  2021-04-03 00:00:00 1549
11  2021-04-04 00:00:00 2926

我的Select:


    select id, min(date) as mind, max(date) as maxd,OE
    from <table>
    group by id,oe
    order by mind desc;

output 应该是这样的:

ID   | MIND                   | MAXD                   | OE
11     2021-04-04 00:00:00      2021-04-04 00:00:00      2926
11     2021-04-01 00:00:00      2021-04-03 00:00:00      1549
11     2021-03-22 00:00:00      2021-03-31 00:00:00      2926
11     2021-03-16 00:00:00      2021-03-21 00:00:00      1344
11     2021-03-10 00:00:00      2021-03-15 00:00:00      2926
11     2021-03-07 00:00:00      2021-03-09 00:00:00      3879
11     2021-03-06 00:00:00      2021-03-06 00:00:00      2926

但它是这样的:

ID   | MIND                   | MAXD                   | OE
11     2021-04-01 00:00:00      2021-04-03 00:00:00      1549
11     2021-03-16 00:00:00      2021-03-21 00:00:00      1344
11     2021-03-07 00:00:00      2021-03-09 00:00:00      3879
11     2021-03-06 00:00:00      2021-04-04 00:00:00      2926

结果应显示一个时间范围,从成员何时成为 OE 的一部分。 即使我添加了一些其他 ID(我显然有),它也不会以正确的顺序显示 OE 更改的时间线。

非常感谢任何帮助!

TIA,

迈克尔

您可以使用一种称为tabibitosan的技巧来进行这种分组:

SELECT id,
       MIN(dt) AS mind,
       MAX(dt) AS maxd,
       oe
FROM   (SELECT id,
               dt,
               oe,
               row_number() OVER (PARTITION BY ID ORDER BY dt) - row_number() OVER (PARTITION BY ID, oe ORDER BY dt) grp
        FROM   your_table)
GROUP  BY id,
          oe,
          grp
ORDER  BY mind DESC;

查看此 dbfiddle以获取结果

这是通过在整个数据集中分配行号(在这种情况下,它是跨每个 id),然后找到跨数据子集的行号(即跨每个 id 和 oe),然后从另一个中减去一个来工作的形成一个可以分组的数字。 连续的行获得相同的组号,但每次出现不连续的行时,组号都会改变。

从Oracle 12开始,可以使用MATCH_RECOGNIZE进行逐行模式匹配:

SELECT *
FROM   table_name
MATCH_RECOGNIZE(
  PARTITION BY id
  ORDER     BY "DATE"
  MEASURES
    FIRST(oe)     AS oe,
    FIRST("DATE") AS mind,
    LAST("DATE")  AS maxd
  PATTERN (same_oe+)
  DEFINE
    same_oe AS oe = FIRST(oe)
)

其中,对于示例数据:

CREATE TABLE table_name (ID, "DATE", OE) AS
SELECT 11, DATE '2021-03-06', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-07', 3879 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-08', 3879 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-09', 3879 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-10', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-11', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-12', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-13', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-14', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-15', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-16', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-17', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-18', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-19', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-20', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-21', 1344 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-22', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-23', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-24', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-25', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-26', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-27', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-28', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-29', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-30', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-03-31', 2926 FROM DUAL UNION ALL
SELECT 11, DATE '2021-04-01', 1549 FROM DUAL UNION ALL
SELECT 11, DATE '2021-04-02', 1549 FROM DUAL UNION ALL
SELECT 11, DATE '2021-04-03', 1549 FROM DUAL UNION ALL
SELECT 11, DATE '2021-04-04', 2926 FROM DUAL;

输出:

ID 原始设备制造商 头脑 最大
11 2926 2021-03-06 00:00:00 2021-03-06 00:00:00
11 3879 2021-03-07 00:00:00 2021-03-09 00:00:00
11 2926 2021-03-10 00:00:00 2021-03-15 00:00:00
11 1344 2021-03-16 00:00:00 2021-03-21 00:00:00
11 2926 2021-03-22 00:00:00 2021-03-31 00:00:00
11 1549 2021-04-01 00:00:00 2021-04-03 00:00:00
11 2926 2021-04-04 00:00:00 2021-04-04 00:00:00

小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM