假设我有这张桌子
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
我尝试使用分组依据/拥有分组,但这比其他方式更容易造成灾难。 这是不可能做的,还是我错过了一些非常简单的事情?
答案 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)