我跑步时
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
。是否有类似的查询将返回所需的结果?
答案 0 :(得分:1)
Distinct on
对子句后面的每种键组合返回一行。在这种情况下,每个ts
将出现一次。哪一个?这由order by
确定。 distinct on
键后面的键确定第一个,因此将是最低的版本号。
您的查询似乎产生了合理的结果。
如果您希望结果集中的一行包含最大的ts
,请使用order by
和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
的最新值。
答案 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;