0

当我跑

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的。是否有类似的查询会返回所需的结果?

4

2 回答 2

1

Distinct on为子句后面的每个键组合返回一行。在这种情况下,每个ts都会出现一次。哪一个?这是由order by. 键后面的distinct on键确定第一个,因此这将是最低的版本号。

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

如果您希望结果集中的一行具有最大的ts,则使用order byand limit/ 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

于 2018-07-24T15:39:51.843 回答
0

据我了解,你想得到version并持续ts

在您的情况下,最好使用 no DISTINCTbutGROUP 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;
于 2018-07-24T18:40:01.717 回答