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

对于两个不同的查询,这实质上是指与t1t2 相同的表。

但是,您使用的特定数据库管理系统(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的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL中两张表联合sum和group by的查询问题

SQL 查询 - GROUP BY , PARTITION BY

sql:group by和 max

每个 GROUP BY 限制 SQL 查询

使用 avg 和 group by 的 SQL 查询

SQL数据库中查询语句Order By和Group By有啥区别