提问人:Saidvali 提问时间:10/28/2023 最后编辑:Saidvali 更新时间:10/30/2023 访问量:112
甲骨文 11g。7天内输出数据
Oracle 11g. Output data within seven days
问:
Oracle 11g 中有一张表,例如:Transactions
CREATE TABLE transactions (id, sender_name, transaction_date, amount) AS
SELECT '1111', 'Alice', TIMESTAMP '2023-01-03 01:26:29', 700 FROM DUAL UNION ALL
SELECT '2222', 'Alice', TIMESTAMP '2023-01-05 04:26:29', 450 FROM DUAL UNION ALL
SELECT '3333', 'Alice', TIMESTAMP '2023-01-08 18:26:29', 1000 FROM DUAL UNION ALL
SELECT '4444', 'Alice', TIMESTAMP '2023-01-09 04:26:29', 200 FROM DUAL UNION ALL
SELECT '6666', 'Betty', TIMESTAMP '2023-03-12 15:26:29', 845 FROM DUAL UNION ALL
SELECT '7777', 'Betty', TIMESTAMP '2023-03-19 11:00:29', 300 FROM DUAL UNION ALL
SELECT '9999', 'Carol', TIMESTAMP '2023-08-26 01:26:29', 100 FROM DUAL UNION ALL
SELECT '8888', 'Carol', TIMESTAMP '2023-08-29 02:26:29', 501 FROM DUAL UNION ALL
SELECT '1234', 'Carol', TIMESTAMP '2023-09-10 03:26:29', 500 FROM DUAL UNION ALL
SELECT '4567', 'Carol', TIMESTAMP '2023-09-11 08:26:29', 501 FROM DUAL UNION ALL
SELECT '2345', 'Carol', TIMESTAMP '2023-09-17 04:26:29', 1001 FROM DUAL UNION ALL
SELECT '3456', 'Carol', TIMESTAMP '2023-09-30 05:26:29', 700 FROM DUAL UNION ALL
SELECT '5678', 'Carol', TIMESTAMP '2023-10-01 05:26:29', 200 FROM DUAL;
对此深表歉意,但我需要两个选项来输出数据:)))
- 选择:
显示客户在第一次汇款后七天内汇款总额超过> 1000笔的交易。在这种情况下,结果应该是:所有 s 个交易,因为第一笔付款是 and 直到,而她在这些天的交易总数是 。并且所有的交易也都有相同的逻辑。对于 Carol 事务 10.09、11.09 和 17.09
(sender_name)
(amount)
transaction_date
Alice
03.01
within seven days
09.01
amount
more than 1000
Betty
2.选项: 是否可以确定一周的开始(从周一开始)并显示一周内(周一至周日)进行的客户交易,总金额超过 1000(一周内的总金额)?如果是,那么该怎么做。
答:
1赞
MT0
10/29/2023
#1
对于选项 1,您可以使用带有范围窗口的分析函数,首先对过去 7 天的金额进行总和,然后在第二遍中计算未来一周中有多少行的行的先前计算的总数超过 1000,并仅筛选到这些行:
SELECT id,
sender_name,
transaction_date,
amount
FROM (
SELECT id,
sender_name,
transaction_date,
amount,
COUNT(CASE WHEN previous_weekly_amount > 1000 THEN 1 END) OVER (
PARTITION BY sender_name
ORDER BY transaction_date
RANGE BETWEEN INTERVAL '0 00:00:00.000000000' DAY TO SECOND PRECEDING
AND INTERVAL '6 23:59:59.999999999' DAY TO SECOND FOLLOWING
) AS has_weekly_total_over_1000
FROM (
SELECT id,
sender_name,
transaction_date,
amount,
SUM(amount) OVER (
PARTITION BY sender_name
ORDER BY transaction_date
RANGE BETWEEN INTERVAL '6 23:59:59.999999999' DAY TO SECOND PRECEDING
AND INTERVAL '0 00:00:00.000000000' DAY TO SECOND FOLLOWING
) AS previous_weekly_amount
FROM transactions
)
)
WHERE has_weekly_total_over_1000 > 0;
对于示例数据,输出:
编号 | SENDER_NAME | TRANSACTION_DATE | 量 |
---|---|---|---|
1111 | 爱丽丝 | 2023-01-03 01:26:29.000000000 | 700 |
2222 | 爱丽丝 | 2023-01-05 04:26:29.000000000 | 450 |
3333 | 爱丽丝 | 2023-01-08 18:26:29.000000000 | 1000 |
4444 | 爱丽丝 | 2023-01-09 04:26:29.000000000 | 200 |
6666 | 贝蒂 | 2023-03-12 15:26:29.000000000 | 845 |
7777 | 贝蒂 | 2023-03-19 11:00:29.000000000 | 300 |
1234 | 颂歌 | 2023-09-10 03:26:29.000000000 | 500 |
4567 | 颂歌 | 2023-09-11 08:26:29.000000000 | 501 |
2345 | 颂歌 | 2023-09-17 04:26:29.000000000 | 1001 |
选项 2 更简单,因为您只需要使用分析函数并按发件人和 ISO 周进行聚合:
SELECT id,
sender_name,
transaction_date,
amount
FROM (
SELECT id,
sender_name,
transaction_date,
amount,
SUM(amount) OVER (PARTITION BY sender_name, TRUNC(transaction_date, 'IW'))
AS weekly_amount
FROM transactions
)
WHERE weekly_amount > 1000;
对于示例数据,输出:
编号 | SENDER_NAME | TRANSACTION_DATE | 量 |
---|---|---|---|
1111 | 爱丽丝 | 2023-01-03 01:26:29.000000000 | 700 |
2222 | 爱丽丝 | 2023-01-05 04:26:29.000000000 | 450 |
3333 | 爱丽丝 | 2023-01-08 18:26:29.000000000 | 1000 |
4567 | 颂歌 | 2023-09-11 08:26:29.000000000 | 501 |
2345 | 颂歌 | 2023-09-17 04:26:29.000000000 | 1001 |
评论
0赞
Saidvali
11/3/2023
您好,感谢您的回答。dbfiddle.uk/4MHJx3iR请检查我的测试,我将计算金额更改为 >1145。表示 Bettys 行不会显示。但也有一行颂歌没有显示。
0赞
MT0
11/3/2023
@Saidvali 如果您想查看正在发生的事情,请运行子查询并查看生成的数据。是的,如果将限制更改为 那么,将发生这种情况,因为排除的行不符合该阈值。Carol 的行不包括在内,因为该行超出了 7 天窗口(1 小时 1 毫秒),因此在 7 天窗口内只有 1001 的总数。>1145
2023-09-10 03:26:29
2023-09-17 04:26:29
0赞
Saidvali
11/3/2023
很棒的@MT0,非常感谢
0赞
Saidvali
11/20/2023
请再问一个问题。在第一个选项中,我想再添加一个表。 桌子。事实上,在表中我还有一列。我们现在使用的,无论货币如何,我们都会得到金额的总和。因此,我想首先转换(计算)汇率,例如以美元为单位,然后将它们相加。示例值为 400,值为 EUR。我将从表格中获取 EUR 的汇率并进行 400 / 0.92 的计算并得到 434.8。如果是美元,请不要碰。你能帮忙吗?CurrencyRate
transactions
currency
amount
amount
currency
CurrencyRate
amount
currency
0赞
MT0
11/20/2023
@Saidvali 在表格中使用 a,然后乘以或除以,如果需要,请使用表达式来检查货币是什么(或者表格中的美元兑美元汇率可能为 1)。JOIN
CurrencyRate
CASE
评论