我目前在编写业务逻辑时遇到问题,无法从带有id的表和我附加到其中的标志中获取行。
例如,
id: id seq num: flag: Date:
A 1 N ..
A 2 N ..
A 3 N
A 4 Y
B 1 N
B 2 Y
B 3 N
C 1 N
C 2 N
我想要达到的最终结果是: 对于每个唯一ID,我只想检索一行,该行的条件为
如果标志是“Y”,则返回该行。
否则返回最后一行“N”行。
另外需要注意的是,'Y'标志并不总是最后一个
我一直试图使用像这样的分区获得case
条件
OVER (PARTITION BY A."ID" ORDER BY A."Seq num")
但到目前为止还没有运气。
- 编辑:
从表格中,样本结果为:
id: id seq num: flag: date:
A 4 Y ..
B 2 Y ..
C 2 N ..
答案 0 :(得分:3)
使用window子句是正确的想法。您应该按ID(如您所做)对结果进行分区,然后对它们进行排序,使Y
标志行先行,然后按降序日期顺序排列所有N
标志行,然后选择第一行对于每个id:
SELECT id, id_seq_num, flag, date
FROM (SELECT id, id_seq_num, flag, date,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY CASE flag WHEN 'Y' THEN 0
ELSE 1
END ASC,
date ASC) AS rk
FROM mytable) t
WHERE rk = 1
答案 1 :(得分:1)
我的方法是采用UNION
两个查询。第一个查询只选择所有Yes
条记录,假设Yes
每ID
组只显示一次。第二个查询仅针对那些在任何地方都没有ID
的{{1}}。对于这些记录,我们使用行号来选择最新的Yes
记录。
No
答案 2 :(得分:1)
这是一种方式(使用非常通用的SQL):
select t1.*
from Table1 as t1
where t1.id_seq_num = COALESCE(
(select max(id_seq_num) from Table1 as T2 where t1.id = t2.id and t2.flag = 'Y') ,
(select max(id_seq_num) from Table1 as T3 where t1.id = t3.id and t3.flag = 'N') )
这里有一个小提琴:http://sqlfiddle.com/#!9/5f7f9/6
答案 3 :(得分:0)
SELECT DISTINCT id,flag 来自你的表