选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列
Posted
技术标签:
【中文标题】选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列【英文标题】:Select query for selecting columns from those records from the inner query . where inner query and outer query have different columns 【发布时间】:2015-06-30 07:32:12 【问题描述】:我有一个分组查询,它可以获取一些记录。如果我希望找到代表这些记录的其他列详细信息怎么办。
假设我有如下查询 .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 ;
【问题讨论】:
你能发布你的表定义和一些示例数据吗? 【参考方案1】:您可以使用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)
。
【讨论】:
我将不得不在 postgresql 上工作更多。我会查的。【参考方案2】:如果我正确理解了这个问题,那么这应该可以工作(或者至少给你一些你可以使用的东西):
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 组合的不同类型的记录,您将得到重复。
【讨论】:
这正是我正在尝试的,而不是 a 和 b,我有 r1 和 r2 但在连接中它说 column r2.rdate doesn't exist 。 select type from records r1 inner join (Select id,max(rdate) from records group by id) r2 on r1.id = r2.id and r1.rdate=r2.rdate ; 您需要通过查询在您的组中使用别名。这就是“as maxdate”在我的查询中所做的。例如select type from records r1 inner join (Select id,max(rdate) as max_rdate from records group by id) r2 on r1.id = r2.id and r1.rdate=r2.max_rdate i.maxdate 是否有错别字 现在可以使用了。我将检查它的正确 .select 类型是否来自记录 r1 内部连接(选择 id,max(rdate) as maxdate from records group by id) r2 on r1.id = r2.id and r1.rdate=r2.maxdate ; 嘎!现在修好了。感谢您的发现!以上是关于选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列的主要内容,如果未能解决你的问题,请参考以下文章