SQL根据条件获取行

时间:2017-05-29 06:29:35

标签: sql select

我目前在编写业务逻辑时遇到问题,无法从带有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     ..

4 个答案:

答案 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条记录,假设YesID组只显示一次。第二个查询仅针对那些在任何地方都没有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 来自你的表