SELECT Postgresql 中的 DISTINCT ON returns 多行

SELECT DISTINCT ON in Postgresql returns multiple rows

当我运行

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 来打破平局。

查询returns

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

我不明白为什么 return 编辑了两个不明显的 ts。有没有类似的查询可以 return 得到想要的结果?

Distinct on returns 子句后的每个键组合一行。在这种情况下,每个 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;

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

据我了解,你想得到 version 和最后一个 ts

在你的情况下最好不使用 DISTINCTGROUP 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;