Postgresql中的SELECT DISTINCT ON返回多行



当我运行时

SELECT DISTINCT ON (ts) * 
FROM tbl 
WHERE clause=100 
AND ts <= '2018-04-02 15:11:18.819000' 
AND ts > '2018-04-02 15:06:18.819000' 
ORDER BY ts, version ASC;

我期望对应于满足条件的最大ts的单行,通过取最低version来打破联系。

查询返回

ts                     version
'2018-04-02 15:07:04.828'   ...   1
'2018-04-02 15:07:05.706'   ...   1

我不明白为什么要返回两个不同的ts。是否有类似的查询可以返回所需的结果?

Distinct on为子句后面的每个键组合返回一行。在这种情况下,每个ts将出现一次。哪一个?这是由CCD_ 6决定的。distinct on密钥之后的密钥决定第一个,因此这将是最低版本号。

您的查询似乎产生了合理的结果。

如果希望结果集中的一行具有最大的ts,则使用order bylimit/fetch first 1 row only:

SELECT * 
FROM tbl 
WHERE clause = 100 AND
ts <= '2018-04-02 15:11:18.819000' AND
ts > '2018-04-02 15:06:18.819000' 
ORDER BY ts DESC, version ASC
FETCH FIRST 1 ROW ONLY;

注意ORDER BY中的ts DESC,以获得ts的最新值。

据我所知,你想得到version和最后一个ts

在您的情况下,最好不要使用DISTINCT,而是使用GROUP BY

例如,此代码可以解决您的问题:

SELECT max(ts), version 
FROM tbl 
WHERE clause=100 
AND ts <= '2018-04-02 15:11:18.819000' 
AND ts > '2018-04-02 15:06:18.819000' 
GROUP BY version;

最新更新