我有一个问题,我的桌子如下所示;
REC_ID | Year | status | -------|-----------|----------| 123 | 2016 | OA | 123 | 2017 | CC |
我的查询应该检查是否为rec_id?如果
因此,在上面的例子中,2016年的记录应该被拿起来。
REC_ID | Year | status | -------|-----------|----------| 456 | 2016 | OP |
在这个例子中,由于只有一个记录,2016年的记录应该被捡起来。
REC_ID | Year | status | -------|-----------|----------| 789 | 2016 | OM | 789 | 2017 | CC |
在最后一个例子中,由于有两个记录,而2016年不是OA,那么2017年的记录应该被拿起来。
我试过对他们进行排名,但这不起作用,我试着做了下面这样的事情,但这两项记录都被拿了起来。
SELECT CASE
WHEN (STATUS = 'OA'
AND YEAR = TO_CHAR(SYSDATE, 'YYYY')
AND ?= REC_ID)
OR ((SELECT COUNT(*)
FROM TABLE
WHERE ?= REC_ID
AND YEAR = TO_CHAR(add_months(sysdate, 12), 'YYYY' ))= 0)
THEN TABLE.STATUS
ELSE
(SELECT STATUS
FROM TABLE
WHERE ?= REC_ID
AND YEAR = TO_CHAR(add_months(sysdate, 12), 'YYYY' )
)
END from TABLE WHERE ?= REC_ID ;发布于 2016-11-30 22:08:45
重新措辞的排名:
使用ROW_NUMBER选择每个rec_id最佳匹配的查询
select rec_id, year, status
from
(
select
rec_id, year, status,
row_number() OVER (partition by rec_id
order by case
when year = 2016 and status = 'OA' then 1
when year = 2017 then 2
else 3
end) as rn
from mytable
where year in (2016, 2017)
)
where rn = 1;发布于 2016-11-30 21:59:39
这是一个优先级查询,建议使用row_number()。我想你想:
select t.*
from (select t.*,
row_number() over (partition by rec_id
order by (case when year = 2016 and status = 'OA' then 1 else 2 end),
year desc
) as seqnum
from table t
where year in (2016, 2017)
) t
where seqnum = 1;https://stackoverflow.com/questions/40898883
复制相似问题