PostgreSQL中的SELECT DISTINCT ON返回多行

时间:2018-07-24 15:38:16

标签: sql postgresql 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。是否有类似的查询将返回所需的结果?

2 个答案:

答案 0 :(得分:1)

Distinct on对子句后面的每种键组合返回一行。在这种情况下,每个ts将出现一次。哪一个?这由order by确定。 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;

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

答案 1 :(得分:0)

据我了解,您是否想获得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;