SQL:如何根据不同的现有条件选择字段?

SQL:如何根据不同的现有条件选择字段?,sql,postgresql,select,conditional-statements,Sql,Postgresql,Select,Conditional Statements,我面临一个SQL问题,它处理基于特定条件选择行的问题。下表示例称为“用户”为u: id category label date rank count 111 weak FFF 2014-06-01 1 4 111 strong DDD 2014-06-02 2 4 111 strong BBB 2014-06-03 3 4 111 weak RRR

我面临一个SQL问题,它处理基于特定条件选择行的问题。下表示例称为“用户”为u:

id    category    label    date        rank count
111   weak        FFF      2014-06-01  1    4
111   strong      DDD      2014-06-02  2    4
111   strong      BBB      2014-06-03  3    4
111   weak        RRR      2014-06-04  4    4
222   weak        WWW      2014-07-01  1    3
222   weak        YYY      2014-07-02  2    3
222   weak        ZZZ      2014-07-03  3    3
有两个唯一的ID(
111
222
)。我想为每个
不同ID
检索最后一个
u.label
,假设
users.category=='weak'
(如
ID222
)下的所有值

但是,如果在
users.category
下存在
'strong'
,则返回与最新日期相对应的
u.label
,其中
users.category='strong'

基本上,我在寻找以下内容:

id    category    label    date      
111   strong      BBB      2014-06-03
222   weak        ZZZ      2014-07-03
到目前为止,我尝试的是使用
“where rank=count”
查询以获取最后一条记录,但对于如何选择
u.label where category=='strong'
,因为它的最后一条记录是
u.category=='weak'
,如
ID111
中所示,我没有选择


谢谢你,请让我知道,如果我可以进一步澄清

类似的情况可能是:

select * from (
   select t.*, 
     row_number() over (
       partition by id 
       order by category asc, dt desc) rn
     from t
) tt where rn = 1;

SQLFiddle:

类似的内容可能是:

select * from (
   select t.*, 
     row_number() over (
       partition by id 
       order by category asc, dt desc) rn
     from t
) tt where rn = 1;

SqlFIDLE:

您的最佳选择是根据您的标准使用行编号对记录进行排序,即先按类别升序,然后按日期降序

SELECT x.*
FROM (

    SELECT id, category, label, date, row_number() OVER (PARTITION BY id ORDER BY category ASC, date DESC) as ordinal_position
    FROM example
) x
WHERE ordinal_position = 1

您的最佳选择是根据您的标准使用行编号对记录进行排序,即先按类别升序,然后按日期降序

SELECT x.*
FROM (

    SELECT id, category, label, date, row_number() OVER (PARTITION BY id ORDER BY category ASC, date DESC) as ordinal_position
    FROM example
) x
WHERE ordinal_position = 1

不需要窗口功能

select distinct on (id) id, category, dt
from t
order by id, category = 'weak', dt desc

false
true
之前排序,因此当
category='weak'
时,它将最后排序

您可以将其他列添加到选择列表中。我只是重用了@mustaccio的小提琴,它没有
标签

在上选中“不区分”:


不需要窗口功能

select distinct on (id) id, category, dt
from t
order by id, category = 'weak', dt desc

false
true
之前排序,因此当
category='weak'
时,它将最后排序

您可以将其他列添加到选择列表中。我只是重用了@mustaccio的小提琴,它没有
标签

在上选中“不区分”:


您使用的是什么数据库/SQL引擎?我使用的是PostgreSQL--很抱歉,忽略了这一点!需要满足哪些条件才能将记录标识为最后一条记录?因此,您需要按照
类别对每个
id
组中的记录进行排序,然后从
日期开始,然后选择组中的第一条记录。有两种方法可以获取最后一条记录:1。如果给定ID的u.category下的所有值=='weak',请选择具有最新u.date(如ID222)2的记录。但是,如果给定ID的u.category下存在“strong”,请选择具有最新u.date和u.category==“strong”(如ID 111中所示)的记录,您使用的是什么数据库/SQL引擎?我使用的是PostgreSQL--很抱歉忽略此项!需要满足哪些条件才能将记录标识为最后一条记录?因此,您需要按照
类别对每个
id
组中的记录进行排序,然后从
日期开始,然后选择组中的第一条记录。有两种方法可以获取最后一条记录:1。如果给定ID的u.category下的所有值=='weak',请选择具有最新u.date(如ID222)2的记录。但是,如果给定ID的u.category下存在“strong”,则选择具有最新u.date和u.category==“strong”(如ID 111中所示)+1的记录,用于在所述数据库(PostGres)中组合一个工作SQL FIDLE.+1用于在所述数据库(PostGres)中组合一个工作SQL FIDLE.+1用于在所述数据库(PostGres)中组装工作SQL FIDLE.+1用于在所述数据库(PostGres)中组装工作SQL FIDLE.+1用于在所述数据库(PostGres)中组装工作SQL FIDLE.+1用于在所述数据库(PostGres)中组装工作SQL FIDLE。