两列中的Postgres不同查询
Postgres distinct query in two columns
我想写一个 postgres 查询。对于(career-id 和 uid)的每个不同组合,我应该 return 具有最大时间的整行。
这是示例数据
id time career_id uid content
1 100 10000 5 Abc
2 300 6 7 xyz
3 200 10000 5 wxv
4 150 6 7 hgr
答案:
id time career_id uid content
2 300 6 7 xyz
3 200 10000 5 wxv
您可以为此使用 CTE。这样的事情应该有效:
WITH cte_max_value AS (
SELECT
career_id,
uid,
max("time") as max_time
FROM mytable
GROUP BY career_id, uid
)
SELECT DISTINCT t.*
FROM mytable AS t
INNER JOIN cte_max_value AS cmv
ON t.uid = cmv.uid AND t.career_id = cmv.career_id AND t.time = cmv.max_time
CTE 为您提供 career_id
和 uid
的所有唯一组合以及相关的最长时间,然后内连接将整行连接到此。我正在使用如果你得到两行具有相同的最大时间的相同组合 career_id
和 uid
你将得到两行返回。
如果您不想这样,则需要找到解决此问题的策略。
编辑:另外,a_hrose_with_name 的解决方案提出的解决方案要好得多,除非您需要与其他服务器有一定程度的兼容性(遗憾的是语法不同),否则您应该改用它。
这可以在 Postgres
中使用 distinct on ()
来完成
select distinct on (career_id, uid) *
from the_table
order by career_id, uid, "time" desc;
我想写一个 postgres 查询。对于(career-id 和 uid)的每个不同组合,我应该 return 具有最大时间的整行。 这是示例数据
id time career_id uid content
1 100 10000 5 Abc
2 300 6 7 xyz
3 200 10000 5 wxv
4 150 6 7 hgr
答案:
id time career_id uid content
2 300 6 7 xyz
3 200 10000 5 wxv
您可以为此使用 CTE。这样的事情应该有效:
WITH cte_max_value AS (
SELECT
career_id,
uid,
max("time") as max_time
FROM mytable
GROUP BY career_id, uid
)
SELECT DISTINCT t.*
FROM mytable AS t
INNER JOIN cte_max_value AS cmv
ON t.uid = cmv.uid AND t.career_id = cmv.career_id AND t.time = cmv.max_time
CTE 为您提供 career_id
和 uid
的所有唯一组合以及相关的最长时间,然后内连接将整行连接到此。我正在使用如果你得到两行具有相同的最大时间的相同组合 career_id
和 uid
你将得到两行返回。
如果您不想这样,则需要找到解决此问题的策略。
编辑:另外,a_hrose_with_name 的解决方案提出的解决方案要好得多,除非您需要与其他服务器有一定程度的兼容性(遗憾的是语法不同),否则您应该改用它。
这可以在 Postgres
中使用distinct on ()
来完成
select distinct on (career_id, uid) *
from the_table
order by career_id, uid, "time" desc;