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

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 ; 嘎!现在修好了。感谢您的发现!

以上是关于选择查询用于从内部查询的这些记录中选择列。其中内部查询和外部查询具有不同的列的主要内容,如果未能解决你的问题,请参考以下文章

带有内部选择查询的 MySQL 搜索

第二次从内部查询中选择

嵌套选择的内部连接 ​​- 多次使用同一列时

用于选择前 3 个字符的 Sql 查询

访问选择查询记录集不可更新

SQL Server - 在视图上选择列的内部查询是啥