我正试图找到一种方法,通过使用groupby函数来返回结果。
是否可以通过忽略NULL字段来创建组。这样它就不会将NULL分组在一起,因为我仍然需要指定字段为NULL的所有行。
我的唱片示例TABLEX
id | 状态 | 模式 | 更新日期|
---|---|---|---|
1 | 空 | 0 | 13:46 |
1 | 空 | 1 | 12:22 |
1 | 1 | 空 | 15:00 |
1 | 0 | 空15:55 |
注意:
- 这是在oracle 18c上运行的
- 一定有更好的方法。。。。这并没有经过我能想到的所有边缘案例的测试。。。但它似乎正在发挥作用
演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=be87b5778616a732db3a3c4787804e0
WITH CTE AS (SELECT 1 ID, null STATUS,0 "MODE", '13:46' UPDATE_DATE from dual UNION ALL
SELECT 1,null,1,'12:22' from dual UNION ALL
SELECT 1,1,null,'15:00' from dual UNION ALL
SELECT 1,0,null,'15:55' from dual)
SELECT A.ID, Z.Status, Y."MODE", max(A.Update_Date) UD
FROM CTE A
CROSS APPLY (SELECT B.Status FROM CTE B WHERE B.ID = A.ID and B.Status is not null ORDER BY UPDATE_DATE DESC FETCH FIRST 1 ROW ONLY) Z
CROSS APPLY (SELECT B."MODE" FROM CTE B WHERE B.ID = A.ID and B."MODE" is not null ORDER BY UPDATE_DATE DESC FETCH FIRST 1 ROW ONLY) Y
GROUP BY ID, Z.Status, Y."MODE"
+----+--------+------+-------+
| ID | STATUS | MODE | UD |
+----+--------+------+-------+
| 1 | 0 | 0 | 15:55 |
+----+--------+------+-------+
- 我没有为更新日期进行数据类型转换,只要时间是24小时格式,结果就会是一样的,所以我没有花时间
- 因此,交叉应用是为主表中的每一行运行一次内联查询,并按照非null值的规则获取状态或模式,并且必须具有最高的Update_Date。我认为
First_Value
分析会起作用;但我无法让它工作。。。(尽管当时我用的是11( - 由于它将为ID内的所有行返回相同的值,因此通过它进行分组可以将我们合并回1条记录
- first_value可能适用于18+我没有在那里尝试
更多测试:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=705747c5b5f0e8414a2561fa82842fb7