显示连续天的交易数据

问题描述 投票:0回答:1

我在 Oracle 11G 中有这个

Transactions
表。请不要评判我提出的问题。

表格有列:

id (guid type)
sender_name
transaction_date
amount
sender_address
sender_phone
receiver_name

transaction_date
列的格式类似于
2014-11-30 04:26:29.000000

我想要的是:显示

Transactions
表中的所有数据,其中那些连续 5 天汇款并在给定
sender_name
中发送
amount
超过 1000 的人。
即使,例如

transaction_date between 01.01.2023 to 01.10.2023

在4月份连续5天汇款,6月份也有连续5天汇款显示全部。

有人可以告诉我该怎么做吗?

我尝试了这些以及与这些问题相关的一些内容:

    Oracle SQL - 查找连续日期的连续值
  • https://dba.stackexchange.com/questions/221178/consecutive-dates-count
  • Oracle sql查询按日期对连续记录进行分组
  • 但我没有得到完全符合我想要的结果。

sql oracle oracle11g
1个回答
0
投票
sender_name

分析函数来查找连续天的组。然后,对于每个组,您可以找到开始日期和结束日期,并筛选出仅包含 5 天或更多天的行:

DENSE_RANK
对于样本数据:

sender_name

输出:


身份证SENDER_NAME3333爱丽丝爱丽丝爱丽丝爱丽丝爱丽丝卡罗尔卡罗尔卡罗尔卡罗尔卡罗尔卡罗尔卡罗尔Oracle 11g 小提琴
TRANSACTION_DATE
2014-11-28 03:26:29.000000000 2222
2014-11-27 02:26:29.000000000 1111
2014-11-26 01:26:29.000000000 4444
2014-11-29 04:26:29.000000000 5555
2014-11-30 05:26:29.000000000 1234
2014-11-28 03:26:29.000000000 8888
2014-11-27 02:26:29.000000000 9999
2014-11-26 01:26:29.000000000 4567
2014-11-28 08:26:29.000000000 5678
2014-12-01 05:26:29.000000000 3456
2014-11-30 05:26:29.000000000 2345
2014-11-29 04:26:29.000000000

如果您使用的是 Oracle 12 或更高版本,那么您可以使用 SELECT id, sender_name, transaction_date FROM ( SELECT id, sender_name, transaction_date, MAX(TRUNC(transaction_date)) OVER (PARTITION BY sender_name, grp) - MIN(TRUNC(transaction_date)) OVER (PARTITION BY sender_name, grp) + 1 AS num_days FROM ( SELECT id, sender_name, transaction_date, TRUNC(transaction_date) - DENSE_RANK() OVER ( PARTITION BY sender_name ORDER BY TRUNC(transaction_date) ) AS grp FROM transactions ) ) WHERE num_days >= 5; :

大大简化解决方案

CREATE TABLE transactions (id, sender_name, transaction_date) AS SELECT '1111', 'Alice', TIMESTAMP '2014-11-26 01:26:29' FROM DUAL UNION ALL SELECT '2222', 'Alice', TIMESTAMP '2014-11-27 02:26:29' FROM DUAL UNION ALL SELECT '3333', 'Alice', TIMESTAMP '2014-11-28 03:26:29' FROM DUAL UNION ALL SELECT '4444', 'Alice', TIMESTAMP '2014-11-29 04:26:29' FROM DUAL UNION ALL SELECT '5555', 'Alice', TIMESTAMP '2014-11-30 05:26:29' FROM DUAL UNION ALL SELECT '6666', 'Betty', TIMESTAMP '2014-11-30 05:26:29' FROM DUAL UNION ALL SELECT '7777', 'Betty', TIMESTAMP '2014-11-30 05:26:29' FROM DUAL UNION ALL SELECT '9999', 'Carol', TIMESTAMP '2014-11-26 01:26:29' FROM DUAL UNION ALL SELECT '8888', 'Carol', TIMESTAMP '2014-11-27 02:26:29' FROM DUAL UNION ALL SELECT '1234', 'Carol', TIMESTAMP '2014-11-28 03:26:29' FROM DUAL UNION ALL SELECT '4567', 'Carol', TIMESTAMP '2014-11-28 08:26:29' FROM DUAL UNION ALL SELECT '2345', 'Carol', TIMESTAMP '2014-11-29 04:26:29' FROM DUAL UNION ALL SELECT '3456', 'Carol', TIMESTAMP '2014-11-30 05:26:29' FROM DUAL UNION ALL SELECT '5678', 'Carol', TIMESTAMP '2014-12-01 05:26:29' FROM DUAL UNION ALL SELECT '9999', 'Debra', TIMESTAMP '2014-11-26 01:26:29' FROM DUAL UNION ALL SELECT '8888', 'Debra', TIMESTAMP '2014-11-27 02:26:29' FROM DUAL UNION ALL SELECT '1234', 'Debra', TIMESTAMP '2014-11-28 03:26:29' FROM DUAL UNION ALL SELECT '4567', 'Debra', TIMESTAMP '2014-11-28 08:26:29' FROM DUAL UNION ALL SELECT '2345', 'Debra', TIMESTAMP '2014-11-30 04:26:29' FROM DUAL UNION ALL SELECT '3456', 'Debra', TIMESTAMP '2014-11-30 05:26:29' FROM DUAL UNION ALL SELECT '5678', 'Debra', TIMESTAMP '2014-12-01 05:26:29' FROM DUAL;

Oracle 18 小提琴

    

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.