【发布时间】:2019-09-19 11:18:49
【问题描述】:
目标: 对于每个“IDCONT”,我需要获取“DAY_ID”,其中我对“STATE_ID”进行了最后一次更改/更新。
例子:
with reftable as (
select 1 as PROCESSID, 'A' as IDCONT, 'X' as STATEID, '10' AS DAY_ID union all
select 2 as PROCESSID, 'A' as IDCONT, 'X' as STATEID, '11' AS DAY_ID union all
select 3 as PROCESSID, 'A' as IDCONT, 'Y' as STATEID, '12' AS DAY_ID union all
select 4 as PROCESSID, 'A' as IDCONT, 'Y' as STATEID, '13' AS DAY_ID union all
select 1 as PROCESSID, 'B' as IDCONT, 'N' as STATEID, '14' AS DAY_ID union all
select 2 as PROCESSID, 'B' as IDCONT, 'N' as STATEID, '15' AS DAY_ID union all
select 3 as PROCESSID, 'B' as IDCONT, 'M' as STATEID, '16' AS DAY_ID union all
select 1 as PROCESSID, 'C' as IDCONT, 'X' as STATEID, '11' AS DAY_ID union all
select 2 as PROCESSID, 'C' as IDCONT, 'X' as STATEID, '18' AS DAY_ID union all
) ...
预期结果:
PROCESSID IDCONT STATID DAYID
3 A Y 12
2 B N 15
1 C X 11
我解决了这个问题:
...
SELECT IDCONT, STATEID, MIN(DAY_ID)
FROM REFTABLE
WHERE (IDCONT, STATEID) IN (
SELECT IDCONT, FIRST_VALUE(STATEID) OVER PARTITION BY IDCONT ORDER BY PROCESSID DESC) AS STATEID
FROM REFTABLE
)
但我想做同样的事情,而不需要第二次调用表。
谢谢!
【问题讨论】:
-
看看这个问题,它有点不同,但我认为它是相同的模式。 stackoverflow.com/questions/121387/…
-
您的 SQL 不起作用。除其他问题外,您的 REFTABLE 定义中没有
FROM DUAL,它会在FIRST_VALUE(STATEID)处引发INVALID RELATIONAL OPERATOR错误。 -
此外,我认为 PROCESSID=2 和 IDCONT = 'B' 的 STATEID = 'M'(不是 'N')的值
-
我不明白你的结果。比如为什么是15?如果数据更改 XXYYXX 怎么办?你选哪个“X”?
标签: sql oracle window-functions