SQL 查询 - GROUP BY , PARTITION BY
Posted
技术标签:
【中文标题】SQL 查询 - GROUP BY , PARTITION BY【英文标题】:SQL Query - GROUP BY , PARTITION BY 【发布时间】:2012-07-22 21:16:02 【问题描述】:这是我的第一篇文章,我是 SQL 新手
我有一张这样的桌子
H Amount Count ID
h1 2 1 x
h2 3 2 x
h3 5 3 x
h1 3 3 x
h1 1 5 y
h2 3 2 x
h3 1 1 x
h3 2 3 y
h2 5 5 y
我希望每个 H 组的 SUM(Amount*Count) 基于该 H 组中的 id / Total SUM(Amount*Count)
即
H value ID
h1 11/16 x value = (2*1+3*3)/2*1+3*3+1*5
h1 5/16 y value = 1*5/ 2*1+3*3+1*5
h2 12/37 x
h2 25/37 y
h3 16/22 x
h3 6/22 y
我的目标是按 H 分组,然后在每个 GROUP 上我必须做 - Sum(average*count) Over(partition by ID) / Sum(average*count)
但是我不能写这样的查询,你们能帮帮我吗? 对格式感到抱歉 谢谢
【问题讨论】:
【参考方案1】:试试这个:
SELECT t2.h, t1.value1/t2.value2, t1.id
FROM
(SELECT sum(value) as value1, id from table
group by id) as t1,
(SELECT sum(value) as value2, h from table
group by h) as t2
WHERE t1.h = t2.h
【讨论】:
【参考方案2】:简单的答案是像这样使用内部查询:
SELECT SUM(Amount * Count), (SELECT SUM(Amount * Count) FROM table AS t2 WHERE t2.H = t1.H)
FROM table AS t1
GROUP BY H, ID
对于两个不同的查询,这实质上是指与t1
和t2
相同的表。
但是,您使用的特定数据库管理系统(mysql、Microsoft SQL Server、sqlite 等)可能具有处理此类事情的内置函数。您应该查看您的 DBMS 提供什么(或在此处使用特定平台标记您的问题)。
【讨论】:
【参考方案3】:您要做的是获取除数(每个h -> id
组的金额*计数的总和)并在另一个子选择中加入除数(每个h
组的金额*计数的总和):
SELECT
a.h, a.id, a.dividend / b.divisor AS value
FROM
(
SELECT h, id, SUM(amount*count) AS dividend
FROM tbl
GROUP BY h, id
) a
INNER JOIN
(
SELECT h, SUM(amount*count) AS divisor
FROM tbl
GROUP BY h
) b ON a.h = b.h
【讨论】:
以上是关于SQL 查询 - GROUP BY , PARTITION BY的主要内容,如果未能解决你的问题,请参考以下文章