SQL group by 按列分组的自定义分组集
SQL group by Custom grouping sets within a group by column
在 Vertica 中是否可以自定义分组,我们不仅需要按列分组,还需要按列分组中的一组数据?
我可能无法正确提出我的问题,但样本数据和预期输出将有助于理解我的问题。
可以使用下面的 WITH 创建示例数据。
;WITH Sample(DayNo, Amt) AS
(
SELECT 1,10.0 UNION
SELECT 2,15.0 UNION
SELECT 3,9.0 UNION
SELECT 4,6.0 UNION
SELECT 5,15.0 UNION
SELECT 6,5.0 UNION
SELECT 7,2.0 UNION
SELECT 8,1.0 UNION
SELECT 9,8.0 UNION
SELECT 10,4.0
)
SELECT DayNo, Amt FROM Sample ORDER BY DayNo;
所以只有 2 列 DayNo(基本上是没有时间的日期)和 Amt(这是该 DayNo 的金额)。
我希望 Sum(Amt) 按 DayNo 分组,但要针对一组天数。例如:
如果我想要一组连续 2 天的 Sum(Amt),那么预期的输出是:
DayNo SUM(Amt)
1-2 25
3-4 15
5-6 20
7-8 3
9-10 12
但是如果我想要一组连续 3 天的 Sum(Amt),那么预期的输出是:
期望的结果
DayNo SUM(Amt)
1-3 34
4-6 26
7-9 11
10-12 4
请注意,同一 DayNo 的数据可能有多行,而不仅仅是 1 行。
您可以使用整数除法分组依据:
SELECT CONCAT(CAST((((DayNo - 1) / 3) + 1) * 3 - 2 AS CHAR(4)), '-',
CAST((((DayNo - 1) / 3) + 1) * 3 AS CHAR(4)))
AS DayNo,
SUM(Amt)
FROM Sample
GROUP BY (DayNo-1) / 3
这会将第 1、2、3 天分成一组,第 4、5、6 天放在下一组。等等
在 Vertica 中是否可以自定义分组,我们不仅需要按列分组,还需要按列分组中的一组数据?
我可能无法正确提出我的问题,但样本数据和预期输出将有助于理解我的问题。
可以使用下面的 WITH 创建示例数据。
;WITH Sample(DayNo, Amt) AS
(
SELECT 1,10.0 UNION
SELECT 2,15.0 UNION
SELECT 3,9.0 UNION
SELECT 4,6.0 UNION
SELECT 5,15.0 UNION
SELECT 6,5.0 UNION
SELECT 7,2.0 UNION
SELECT 8,1.0 UNION
SELECT 9,8.0 UNION
SELECT 10,4.0
)
SELECT DayNo, Amt FROM Sample ORDER BY DayNo;
所以只有 2 列 DayNo(基本上是没有时间的日期)和 Amt(这是该 DayNo 的金额)。
我希望 Sum(Amt) 按 DayNo 分组,但要针对一组天数。例如: 如果我想要一组连续 2 天的 Sum(Amt),那么预期的输出是:
DayNo SUM(Amt)
1-2 25
3-4 15
5-6 20
7-8 3
9-10 12
但是如果我想要一组连续 3 天的 Sum(Amt),那么预期的输出是: 期望的结果
DayNo SUM(Amt)
1-3 34
4-6 26
7-9 11
10-12 4
请注意,同一 DayNo 的数据可能有多行,而不仅仅是 1 行。
您可以使用整数除法分组依据:
SELECT CONCAT(CAST((((DayNo - 1) / 3) + 1) * 3 - 2 AS CHAR(4)), '-',
CAST((((DayNo - 1) / 3) + 1) * 3 AS CHAR(4)))
AS DayNo,
SUM(Amt)
FROM Sample
GROUP BY (DayNo-1) / 3
这会将第 1、2、3 天分成一组,第 4、5、6 天放在下一组。等等