我是球场上的新手,几天来我一直在与一个问题作斗争,这让我抓狂.简而言之:我正在寻找连续几天下单的用户.例如:20230715、20230715、20230716、20230717、20230717、20230718.

不连续购买的用户不应包括在内,例如:20230715、20230715、20230719.

你能帮我写一个SQL Oracle代码吗?非常感谢.我也试图为这个话题找到任何解决方案,但到目前为止我还没有找到任何解决方案.

这是我众多try 中的一个.除此之外,我还try 使用Lag()和Lead()函数,但收效甚微.

我想提取连续天数的客户的订单.此外,我还希望在单行/用户中管理匹配的实例,因为稍后我想要计算这些天/用户的支出


WITH ranked_data AS (
    SELECT
        "USER",
        "COMPANY",
        "CREATIONDATE",
        ROW_NUMBER() OVER (PARTITION BY "USER", "COMPANY" ORDER BY "CREATIONDATE") AS rn
    FROM
        P_TEST_P
)
SELECT
    "USER",
    "COMPANY",
    LISTAGG("CREATIONDATE", ', ') WITHIN GROUP (ORDER BY "CREATIONDATE") AS "CONSECUTIVE_DATES"
FROM
    ranked_data
GROUP BY
    "USER",
    "COMPANY";

输入示例:

USER;Company;creationdate
Liza;Amigurumi KFT;20230712
Liza;Amigurumi KFT;20230713
Liza;Amigurumi KFT;20230714
Liza;Amigurumi KFT;20230715
Liza;Amigurumi KFT;20230728
Liza;Amigurumi KFT;20230718
Liza;Amigurumi KFT;20230722
Liza;Amigurumi KFT;20230723
Liza;Amigurumi KFT;20230724
Liza;Amigurumi KFT;20230729
Liza;Amigurumi KFT;20230729
Liza;Amigurumi KFT;20230729
Liza;Bubu btk;20230703
Liza;Bubu btk;20230703
Liza;Bubu btk;20230708
Liza;Bubu btk;20230711
Liza;Bubu btk;20230722
Liza;PGGNG;20230728
Liza;PGGNG;20230728
Liza;PGGNG;20230728
Liza;PGGNG;20230730
Patrik;YNWA;20230701
Patrik;YNWA;20230706
Patrik;YNWA;20230708
Patrik;YNWA;20230709
Patrik;HUNF;20230725
Patrik;HUNF;20230729
Laszlo;FOUR GRG;20230712
Laszlo;FOUR GRG;20230713
Laszlo;FOUR GRG;20230713
Laszlo;FOUR GRG;20230714

推荐答案

SELECT * FROM (
    SELECT * FROM P_TEST_P 
    MATCH_RECOGNIZE (
        PARTITION BY usr
        ORDER BY creationdate
        MEASURES FIRST(creationdate) AS from_dat, LAST(creationdate) AS to_dat
        PATTERN( conseq+ strt )
        DEFINE 
            conseq AS NEXT(dat) = dat + 1
    )
)
MATCH_RECOGNIZE (
    PARTITION BY usr
    ORDER BY from_dat, to_dat
    MEASURES FIRST(from_dat) AS from_dat, MAX(to_dat) AS to_dat
    PATTERN( merged* strt )
    DEFINE 
        merged AS NEXT(from_dat) = to_dat
)
;

如果您改变主意并希望考虑到公司,只需将其添加到分区by子句中即可.

Sql相关问答推荐

创建每小时重置的序列号

当有空单元格时,如何连接列

按每天的最大值分组

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

连接三个表的正确方式是什么?在这三个表中,可以显示在一个表上的行将在其他表中显示结果

通过之前的连接-这是Oracle的错误吗?

每年独特口味的冰淇淋数量

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

Oracle 23c ROUND,数据类型为DATE

以一致的价值获得独特的价值

在Netezza SQL中将字符DataType转换为整型DataType

对于多字节字符,SQL Server中的DATALENGTH返回1字节

如何解决错误;ORA-00911:无效字符;在果朗?

插入具有预期逻辑的查询以Forking 表

存储过程太慢

显示所有组并计算给定组中的项目(包括 0 个结果)

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

PostgreSQL - 从同一张表中获取值