GROUP BY没有提供独特的记录

时间:2016-07-03 05:57:38

标签: c# sql-server

我正在尝试通过让我的SQL查询消除重复项(名为HouseName的字段)来保存一些C#代码。我想我需要使用GROUP BY子句,因为我想要存在的重复数量。我拉了9个字段,其中只有一个是聚合字段。但我也想拉出每一行的主键。当我在GROUP BY语句中包含它时,我不再获得HouseName的不同数据,因为ID明显不同。这是一个有用的片段:

SELECT HouseName, COUNT (HouseName) AS numRuns, PrimaryVideoSource, EventType
From...
GROUP BY HouseName, PrimaryVideoSource, EventType

这样可行,但如果我不在Group By中包含最后两个字段,则会引发错误。好的,得到它,我必须在GROUP BY中包含非聚合字段。

但是如果我想拉主键,这就是声明:

SELECT HouseName, COUNT (HouseName) AS numRuns, PrimaryVideoSource, EventType, EventUniqueID
From...
GROUP BY HouseName, PrimaryVideoSource, EventType, EventUniqueID

现在我获得了主键,但我不再获得不同的HouseNames。我正在重复。

如何使用GROUP BY语句包含主键而不会丢失我所获得的不同HouseName字段?

我可以放弃获取Count(HouseName),虽然这很方便,只需使用DISTINCT语句,但保留计数会很好,而且我认为我收到了不同的错误消息无论如何我试过了。

1 个答案:

答案 0 :(得分:0)

我们必须看一些示例输入和输出才能给出一个很好的答案,但作为一个开始,基于我的理解...

您无法获得我认为您正在寻找SQL的分层结果。

如果您需要每组中每行的ID,您可能只想在C#中执行此操作。可能会有一些带宽优化,但不太可能值得这样做。

问题源于SQL缺少"列表"列类型。它不是它的意思。每个单元格都必须包含标量值,因此无法返回主键集合。

我假设这不是你想要的,但是你必须将ID包装在一个聚合函数中才能使它工作。如果你只是想知道"首先"记录,您可以使用MIN

SELECT HouseName
    , COUNT (HouseName) AS numRuns
    , PrimaryVideoSource
    , EventType
    , MIN(EventUniqueID) ToKeep
FROM ...
GROUP BY HouseName, PrimaryVideoSource, EventType, EventUniqueID

另一个选项,虽然如果您在C#中处理事物并不是非常有用,但是要包括所有记录,还要包括每个集合包含的数量。

SELECT HouseName
    , COUNT(*) OVER (PARTITION BY HouseName, PrimaryVideoSource, EventType) numRuns
    , PrimaryVideoSource
    , EventType
    , EventUniqueID
FROM ...