SQL:如何根据不同的现有条件选择字段?
我面临一个SQL问题,它处理基于特定条件选择行的问题。下表示例称为“用户”为u: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
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。