我有一个按查询分组,它会取出一些记录。如果我希望找到代表这些记录的其他列详细信息,该怎么办?
假设我有如下查询。Select id,max(date) from records group by id;
获取表中最新的条目。
我希望获取另一列代表这些记录。
我想做这样的事情(这个不正确的查询只是例如):
Select type from (Select id,max(date) from records group by id)
但此类型在内部查询中不存在。
我无法以更简单的方式定义问题。我为此道歉。
感谢任何帮助。
编辑:
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer |
rdate | date |
type | character varying(20) |
示例数据:
id | rdate | type
----+------------+------
1 | 2013-11-03 | E1
1 | 2013-12-12 | E1
2 | 2013-12-12 | A3
3 | 2014-01-11 | B2
1 | 2014-01-15 | A1
4 | 2013-12-23 | C1
5 | 2014-01-05 | C
7 | 2013-12-20 | D
8 | 2013-12-20 | D
9 | 2013-12-23 | A1
当我尝试这样的事情时(我不擅长sql):select type from records as r1 inner join (Select id,max(rdate) from records group by id) r2 on r1.rdate = r2.rdate ;
或
select type from records as r1 ,(Select id,max(rdate) from records group by id) r2 inner join r1 on r1.rdate = r2.rdate ;
答案 0 :(得分:2)
您可以使用window function:
轻松完成此操作SELECT id, rdate, type
FROM (
SELECT id, rdate, type, rank() OVER (PARTITION BY id ORDER BY rdate DESC) rnk
FROM records
WHERE rnk = 1
) foo
ORDER BY id;
窗口定义OVER (PARTITION BY id ORDER BY rdate DESC)
获取具有相同id
值的所有记录,然后从最近到最近的rdate
进行排序,并为每行分配排名。等级1是最新的,因此相当于max(rdate)
。
答案 1 :(得分:1)
如果我对这个问题的理解是正确的,那么这应该有用(或者至少可以为你提供一些你可以使用的东西):
SELECT
b.id, b.maxdate, a.type
FROM
records a -- this is the records table, where you'll get the type
INNER JOIN -- now join it to the group by query
(select id, max(rdate) as maxdate FROM records GROUP BY id) b
ON -- join on both rdate and id, otherwise you'll get lots of duplicates
b.id = a.id
AND b.maxdate = a.rdate
请注意,如果您有相同ID和rdate组合的不同类型的记录,您将获得重复项。