[英]SQL query to group based on sum
我有一个简单的表,其中的值我想根据这些值的总和(最多为某个限制组总和)将块/分区分成不同的组。
例如,。 想象一下如下表:
Key Value
-----------
A 1
B 4
C 2
D 2
E 5
F 1
而且我想分成几组,这样任何一个分组的总和都不会超过某个给定值(比如说5)。
结果将是这样的:
Group Key Value
-------------------
1 A 1
B 4
--------
Total: 5
2 C 2
D 2
--------
Total: 4
3 E 5
--------
Total: 5
4 F 1
--------
Total: 1
这样的查询可能吗?
虽然我倾向于同意这些最好在SQL之外完成的评论,但这里有一些SQL似乎大致上你要求的:
with mytable AS (
select 'A' AS [Key], 1 AS [Value] UNION ALL
select 'B', 4 UNION ALL
select 'C', 2 UNION ALL
select 'D', 2 UNION ALL
select 'E', 5 UNION ALL
select 'F', 1
)
, Sums AS (
select T1.[Key] AS T1K
, T2.[Key] AS T2K
, (SELECT SUM([Value])
FROM mytable T3
WHERE T3.[Key] <= T2.[Key]
AND T3.[Key] >= T1.[Key]) AS TheSum
from mytable T1
inner join mytable T2
on T2.[Key] >= T1.[Key]
)
select S1.T1K AS StartKey
, S1.T2K AS EndKey
, S1.TheSum
from Sums S1
left join Sums S2
on (S1.T1K >= S2.T1K and S1.T2K <= S2.T2K)
and S2.TheSum > S1.TheSum
and S2.TheSum <= 5
where S1.TheSum <= 5
AND S2.T1K IS NULL
当我在SQL Server 2008上运行此代码时,我得到以下结果:
StartKey EndKey Sum
A B 5
C D 4
E E 5
F F 1
从这些结果构建所需的组应该是直截了当的。
如果您希望每组中只有两个或更少成员,则可以使用以下查询:
Select
A.[Key] as K1 ,
B.[Key] as K2 ,
isnull(A.value,0) as V1 ,
isnull(B.value,0) as V2 ,
(A.value+B.value)as Total
from Table_1 as A left join Table_1 as B
on A.value+B.value<=5 and A.[Key]<>B.[Key]
要查找具有更多成员的集合,您可以继续使用联接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.