【发布时间】:2021-04-06 22:23:12
【问题描述】:
我的数据是这样的
MY_TABLE
| DATE | CUSTOMER_ID | FAC_NUM | MONIES |
|---|---|---|---|
| 01/Jan/2020 | 12345678 | ABC123 | 125000 |
| 02/Jan/2020 | 12345678 | ABC123 | 125000 |
| 03/Jan/2020 | 12345678 | ABC123 | 125000 |
| 01/Feb/2020 | 12345678 | ABC123 | 143000 |
| 02/Feb/2020 | 12345678 | ABC123 | 143000 |
| 03/Feb/2020 | 12345678 | ABC123 | 143000 |
| 04/Feb/2020 | 12345678 | ABC123 | 143000 |
| 05/Feb/2020 | 12345678 | ABC123 | 143000 |
| 01/Mar/2020 | 12345678 | ABC123 | 125000 |
| 02/Mar/2020 | 12345678 | ABC123 | 125000 |
| 03/Mar/2020 | 12345678 | ABC123 | 125000 |
| 04/Mar/2020 | 12345678 | ABC123 | 125000 |
我希望输出是这样的
| CUSTOMER_ID | FAC_NUM | MONIES | START_DATE | END_DATE |
|---|---|---|---|---|
| 12345678 | ABC123 | 125000 | 01/Jan/2020 | 03/JAN/2020 |
| 12345678 | ABC123 | 143000 | 01/Feb/2020 | 05/Feb/2020 |
| 12345678 | ABC123 | 125000 | 01/Mar/2020 | 04/Mar/2020 |
我尝试过使用以下
SELECT CUSTOMER_ID
,FAC_NUM
,MONIES
,MIN(DATE) AS START_DATE
,MAX(DATE) AS END_DATE
FROM MY_TABLE
GROUP BY CUSTOMER_ID
,FAC_NUM
,MONIES
但是,我用这种方法得到的输出如下(这不是想要的输出)
| CUSTOMER_ID | FAC_NUM | MONIES | START_DATE | END_DATE |
|---|---|---|---|---|
| 12345678 | ABC123 | 125000 | 1 Jan 2020 | 4 Mar 2020 |
| 12345678 | ABC123 | 143000 | 1 Feb 2020 | 5 Feb 2020 |
有没有办法在不使用 PL/SQL 的情况下获得我正在寻找的输出(我需要在一个巨大的数据集上运行这个查询)?如果不是,那么使用 PL/SQL 执行此操作的最有效方法是什么?
我是 stackoverflow 和 SQL 的新手。非常感谢您的支持。
提前感谢您的帮助。
问候, 阿尼
【问题讨论】:
标签: sql oracle datetime aggregate-functions gaps-and-islands