嵌套的Group By可以在一个Select中完成吗?

时间:2014-04-28 17:29:09

标签: sql tsql recursion grouping

使用T-SQL(我们在2008年,但如果可以在2012年使用一些新的功能/扩展,请注意)

这完全出于好奇......我最终只是在GROUP BY中使用GROUP BY。但我很想知道是否有办法在单个查询中执行此操作,也许还有一些奇特的shmancy函数或扩展我还没有学到。 ......这是一项挑战,而不是完成工作的需要,因为它已经完成了。

我尝试在这里构建一个示例表,但它太大而无法构建,所以这就是概念。该表有三列,UserID,UserGroupID和Minutes。以一小时为增量,我们记录用户在应用程序中花费的时间。因此,例如,UserID 1在04/28/2014 10:00:00的小时内花费了10分钟,然后在2014年4月28日11:00:00的小时内花费了15分钟......依此类推。 (对于此示例,请忽略每天或每月的任何时间限制等)

我希望每组使用该应用程序至少30分钟的用户数量。这是使用的逻辑:

SELECT UserGroupID, COUNT(*)
FROM (
    SELECT UserGroupID, UserID
    FROM Example
    GROUP BY UserGroupID, UserID
    HAVING SUM([Minutes]) >= 30
) AS x
GROUP BY UserGroupID

问题是,这可以在一个查询中完成吗?我不是在寻找效率,我只是好奇。

1 个答案:

答案 0 :(得分:0)

我不这么认为,但是负面证明很难证明。

可以简化以下查询(不包含having子句)。所以:

SELECT UserGroupID, COUNT(*)
FROM (
    SELECT UserGroupID, UserID
    FROM Example
    GROUP BY UserGroupID, UserID
) AS x
GROUP BY UserGroupID;

几乎与:

相同
SELECT UserGroupId, COUNT(DISTINCT UserId)
FROM Example
GROUP BY UserGroupId;

(如果UserId可以是NULL,则这些不完全相同,但也可以处理这种情况。)

但是,我不认为有办法完成您的全部查询。您需要按UserGroupId, UserId汇总才能获得sum()条件。然后,您只需按UserGroupId汇总。没有什么可以想到的。