Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:按所有列分组_Sql Server - Fatal编程技术网

Sql server SQL Server:按所有列分组

Sql server SQL Server:按所有列分组,sql-server,Sql Server,我有一个有16列的表和超过100万条记录(每月都会批量添加大约20万条记录) 大概是这样的: +----+------+------+-----+--------+----------------+ | Id | Col2 | Col3 | ... | Col 15 | Numeric Column | +----+------+------+-----+--------+----------------+ | 1 | xxx | xxx | ... | xxx |

我有一个有16列的表和超过100万条记录(每月都会批量添加大约20万条记录)

大概是这样的:

+----+------+------+-----+--------+----------------+
| 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