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 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;
注意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;
当我运行
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 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;
注意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;