替代 GROUP BY 列中对相关子查询结果的引用

Posted

技术标签:

【中文标题】替代 GROUP BY 列中对相关子查询结果的引用【英文标题】:Alternative to references in a GROUP BY column to the results of a correlated subquery 【发布时间】:2013-12-29 01:26:09 【问题描述】:

这个问题是由于 Amazon Redshift(基于 Paraccel 的列式分析数据库)的限制而出现的。不支持的功能之一是references in a GROUP BY column to the results of a correlated subquery。

例如,以下语句将生成 Redshift 错误,因为 GROUP BY 使用由子查询生成的list

select listing.listid,
(select count (sales.listid) from sales where sales.listid=listing.listid) as list
from listing
group by list, listing.listid; 

Gordon Linoff 中的以下示例是另一个不受支持的用例(对生成此一般问题的specific question 的回答)。

select type, (case when cnt > XXX then url end) as url, sum(cnt) as visit_cnt
from (select type, url, count(*) as cnt
      from t
      group by type, url
     ) t
group by type, url
order by type, sum(cnt) desc;

这个问题的目的是找到一个通用模式来克服这个特定的 Amazon Redshift 相关子查询限制。有哪些替代 SQL 模式可以实现与使用相关子查询中的值相同的结果?

【问题讨论】:

对于不熟悉 Redshift 的人:假设您正在使用大致 PostgreSQL 8.1/8.2 功能集,以及一些额外的功能和额外的限制。没有 CTE 或窗口函数,没有 unnestarray_agg 等(顺便说一句,如果有 Redshift SQLFiddle 那就太好了)。 你确实有窗口函数:docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html +1 @Guy:确实有窗口函数。不过,它们确实有局限性。 【参考方案1】:

左连接应该可以解决问题,除非我遗漏了什么。

SELECT listing.listid
      ,COUNT(sales.listid)
FROM      listing
LEFT JOIN sales
       ON sales.listid = listing.listid
GROUP BY listing.listid
ORDER BY COUNT(sales.listid) DESC
; 

【讨论】:

以上是关于替代 GROUP BY 列中对相关子查询结果的引用的主要内容,如果未能解决你的问题,请参考以下文章

获取“COUNT”/“GROUP BY”MySQL查询的空结果

sql:group by和 max

如何在没有算术计数的SQL子查询中使用GROUP BY

如何在 MySQL 中对 GROUP BY 结果的 SELECT INTO 使用自动增量?

Mysql5.7中子查询时order by与group by合用无效的解决办法

group by JSON包含数组的列