【问题标题】:SQL: How do I select fields based on varying existing conditions?SQL:如何根据不同的现有条件选择字段?
【发布时间】:2014-09-22 11:33:05
【问题描述】:

我遇到了一个 SQL 问题,该问题涉及根据特定条件选择行。下面的示例表称​​为 'users' as 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(111222)。假设users.category == 'weak' 下的所有值(如ID 222),我想为每个distinct ID 检索最后一个u.label

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

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

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',如@ 987654336@.

谢谢,如果我能进一步澄清,请告诉我!

【问题讨论】:

  • 你使用的是什么数据库/SQL引擎?
  • 我正在使用 PostgreSQL -- 很抱歉省略了!
  • 一条记录需要满足哪些条件才能被标识为最后一条记录
  • 因此您需要按category 对每个id 组中的记录进行排名,然后将date 降序排列,然后选择组中的第一条记录。
  • 最后一条记录的获取方式有两种: 1、如果u.category=='weak'下的所有值都对应给定的ID,则选择u.date最近的记录(如ID 222 ) 2. 但是,如果给定 ID 的 u.category 下存在 'strong',请选择具有最新 u.date u.category=='strong' 的记录(如 ID 111)

标签: sql postgresql select conditional-statements


【解决方案1】:

类似这样的东西,可能是:

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

SQLFiddle:http://sqlfiddle.com/#!1/475d49/1/0

【讨论】:

  • +1 用于在上述数据库 (PostGres) 中组合一个有效的 SQL Fiddle。
【解决方案2】:

您最好的选择是使用 row_number 根据您的条件对记录进行排序,即首先按类别升序排序,然后按日期降序排序。

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

SQL Fiddle

【讨论】:

  • +1 用于在上述数据库 (PostGres) 中组合一个有效的 SQL Fiddle。
【解决方案3】:

不需要窗口函数

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

SQL Fiddle

false 排在true 之前,所以当category = 'weak' 排在最后时

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

查看distinct on:

http://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT

【讨论】:

  • +1 用于在上述数据库 (PostGres) 中组合一个有效的 SQL Fiddle。
猜你喜欢
  • 2021-12-19
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多