我有一个包含两个ID值的表。密钥是ID组合,其中一个ID可以为空,但不能同时为空。比较键时忽略空值。就像这样:
ID1 ID2 TIMESTAMP
___________________________
A 1 2023-09-01 11:00
A null 2023-09-01 10:00
B null 2023-09-01 09:00
null 1 2023-09-01 08:00
B 2 2023-09-01 07:00
根据数据模型,ID 1不应与最多一个ID 2匹配(因此情况A 1、B 1是不可能的)。我需要按 * 键 * 计数行,即。第1,2,4行和第3,5行应该被视为相同,group by应该产生类似的结果:
ID1 ID2 COUNT
_____________
A 1 3
B 2 2
用SQL可以做到这一点吗?Oracle 19c的
4条答案
按热度按时间dtcbnfnu1#
您可以使用相关子查询:
其中,对于样本数据:
输出:
| ID1| ID2| CNT|
| --|--|--|
| 一| 1 | 3 |
| B| 2 | 2 |
fiddle
jobtbby32#
您正在查找ID1和ID2都不为空的组。在这些组中,您希望计算与任一ID匹配的所有行。为此使用相关子查询。
演示:https://dbfiddle.uk/UQcmFgGC
4dc9hkyq3#
最后,我以下面的查询结束:
感谢JonasMetzler的建议。
cbwuti444#
注意:这回答了5th revision of the question,而不是后来的编辑。
在Oracle 12中,您可以使用
MATCH_RECOGNIZE
进行逐行模式匹配:其中,对于样本数据:
输出:
| ID1| ID2| CNT|
| --|--|--|
| B| 2 | 2 |
| 一| 1 | 3 |
fiddle