选择查询以从内部查询中选择这些记录中的列。内部查询和外部查询具有不同的列

时间:2015-06-30 07:32:12

标签: postgresql select amazon-redshift

我有一个按查询分组,它会取出一些记录。如果我希望找到代表这些记录的其他列详细信息,该怎么办?

假设我有如下查询。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 ;

2 个答案:

答案 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组合的不同类型的记录,您将获得重复项。