Sql server SQL Server:按所有列分组
我有一个有16列的表和超过100万条记录(每月都会批量添加大约20万条记录) 大概是这样的:Sql server SQL Server:按所有列分组,sql-server,Sql Server,我有一个有16列的表和超过100万条记录(每月都会批量添加大约20万条记录) 大概是这样的: +----+------+------+-----+--------+----------------+ | Id | Col2 | Col3 | ... | Col 15 | Numeric Column | +----+------+------+-----+--------+----------------+ | 1 | xxx | xxx | ... | xxx |
+----+------+------+-----+--------+----------------+
| Id | Col2 | Col3 | ... | Col 15 | Numeric Column |
+----+------+------+-----+--------+----------------+
| 1 | xxx | xxx | ... | xxx | 10 |
| 2 | yyy | yyy | ... | yyy | 20 |
| 3 | zzz | zzz | ... | zzz | 30 |
| 4 | xxx | xxx | ... | xxx | 40 |
+----+------+------+-----+--------+----------------+
大多数记录都是唯一的,但也有重复的。
我需要在这个表上创建一个视图来聚合这些重复的行,考虑到每一列。
聚合记录时,我需要显示最后一个数字列的总和。
例如,我的视图需要聚合记录1和记录4。
预期结果是(注意50(10+40)之和):
我通过以下查询完成了此操作:
SELECT
[Column 2],
[Column 3],
...,
[Column 15],
SUM([Numeric Column]) AS [Sum Of Numeric Column],
COUNT(*) AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
[Column 3],
...,
[Column 15]
此视图将作为需要聚合数据的其他视图的基础视图。这意味着它需要非常快。我的问题很简单:知道这个视图需要为其他视图提供数据,这是正确的方法吗?有没有办法优化此查询?我可以安排索引吗
谢谢。不太确定,但想法是创建2个CTE,仅在需要时计算聚合。您可以对此进行测试,并将其与您自己的查询进行比较
WITH Dups AS
(
SELECT
[Column 2],
[Column 3],
...,
[Column 15],
SUM([Numeric Column]) AS [Sum Of Numeric Column],
COUNT(*) AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
[Column 3],
...,
[Column 15]
HAVING COUNT(*) > 1
),
REGS AS
(
SELECT
[Column 2],
[Column 3],
...,
[Column 15],
[Numeric Column],
1 AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
[Column 3],
...,
[Column 15]
HAVING COUNT(*) = 1
)
SELECT * FROM Regs UNION ALL SELECT * FROM Dups ORDER BY SomeCol
据我所知,您的查询已经优化,不需要进一步优化。在您的情况下,使用CTE只会降低性能 你有什么问题?到目前为止还没有真正的问题。我只是想就如何使用GROUP BY here来聚合重复行征求意见。查询速度已经相当慢,而且考虑到将来会增加数百万行,我希望得到最好的解决方案。然后访问
WITH Dups AS
(
SELECT
[Column 2],
[Column 3],
...,
[Column 15],
SUM([Numeric Column]) AS [Sum Of Numeric Column],
COUNT(*) AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
[Column 3],
...,
[Column 15]
HAVING COUNT(*) > 1
),
REGS AS
(
SELECT
[Column 2],
[Column 3],
...,
[Column 15],
[Numeric Column],
1 AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
[Column 3],
...,
[Column 15]
HAVING COUNT(*) = 1
)
SELECT * FROM Regs UNION ALL SELECT * FROM Dups ORDER BY SomeCol