仅当具有最新值的列“ date”具有另一列非NULL时,才检索行

时间:2018-06-21 15:59:45

标签: sql postgresql greatest-n-per-group

假设我有这张桌子

id  | value | date       | result
----+-------+------------+--------
1   | 1     | 2017-01-01 | NULL 
2   | 1     | 2017-01-02 | NULL 
3   | 2     | 2017-01-03 | NULL 
4   | 1     | 2017-01-04 | NULL  
5   | 2     | 2017-01-05 | NULL 
6   | 3     | 2017-01-06 | NULL 
7   | 1     | 2017-01-07 | NULL 

我的目标是检索每个最后一个“日期”具有等于“ NULL”的“结果”的“值”。

例如,对于上一个表,我的结果应如下所示:

id  | value | date       | result
----+-------+------------+--------
5   | 2     | 2017-01-05 | NULL
6   | 3     | 2017-01-06 | NULL
7   | 1     | 2017-01-07 | NULL 

我使用的查询是:

SELECT DISTINCT ON (value) * 
FROM table 
WHERE result IS NULL 
ORDER BY value ASC, date DESC

但是当我得到这张桌子时:

id  | value | date       | result
----+-------+------------+--------
1   | 1     | 2017-01-01 | NULL
2   | 1     | 2017-01-02 | NULL
3   | 2     | 2017-01-03 | NULL
4   | 1     | 2017-01-04 | NULL
5   | 2     | 2017-01-05 | something
6   | 3     | 2017-01-06 | NULL
7   | 1     | 2017-01-07 | NULL

我得到

id  | value | date       | result
----+-------+------------+--------
4   | 2     | 2017-01-04 | NULL
6   | 3     | 2017-01-06 | NULL
7   | 1     | 2017-01-07 | NULL

代替

id  | value | date       | result
----+-------+------------+--------
6   | 3     | 2017-01-06 | NULL
7   | 1     | 2017-01-07 | NULL

我尝试使用分组依据/拥有分组,但这比其他方式更容易造成灾难。 这是不可能做的,还是我错过了一些非常简单的事情?

1 个答案:

答案 0 :(得分:1)

您应该在查询之外使用条件:

select *
from (
    select distinct on (value) * 
    from my_table 
    order by value asc, date desc
    ) s
where result is null
order by id

 id | value |    date    | result 
----+-------+------------+--------
  6 |     3 | 2017-01-06 | 
  7 |     1 | 2017-01-07 | 
(2 rows)