考虑以下3列表结构:
id, b_time, b_type
id
是一个字符串,表中将有多个具有相同ID的行。
b_time
是时间戳,b_type
可以包含2个可能值中的任何一个 - “A”或“B”。
我想选择满足以下两个条件之一的所有行,优先级:
对于所有ID,请选择时间戳最高的行,其中b_type ='A'。
如果对于id,没有b_type ='A'的行,请选择时间戳最高的行,而不考虑b_type值。
请建议应该解决此问题的sql查询(即使它需要创建临时中间表)。
答案 0 :(得分:2)
找出一种简单直观的方法:
SELECT * FROM
(SELECT id
, b_time
, b_type
, ROW_NUMBER() OVER (PARTITION BY id ORDER BY b_type ASC,b_time DESC) AS RN
FROM your_table
)
WHERE RN = 1
答案 1 :(得分:0)
with nottypea as (select id, max(b_time) as mxtime
from tablename
group by id
having sum(case when b_type = 'A' then 1 else 0 end) = 0)
, typea as (select id, max(b_time) as mxtime
from tablename
group by id
having sum(case when b_type = 'A' then 1 else 0 end) >= 1)
select id,mxtime,'B' as typ from nottypea
union all
select id,mxtime,'A' as typ from typea