[英]Grouping the results of an SQL Select
我正在尝试实现我认为的简单的来自mssql select语句的结果分组,如下所示;
SELECT
DATEPART( day, Review.[LocalTimeGenerated] ) AS DayNum,
Review.[LocalTimeGenerated] AS LocalDate,
( Users.[FirstName] + ' ' + Users.[SecondName] ) AS FullName,
SUBSTRING(
Review.[Text],
PATINDEX(
'%into %',
Review.[Text]
) + 5,
50
) AS LastDoorEntered /* return only the door name */
FROM [LOGS].[dbo].[Review] Review
INNER JOIN [DATA].[dbo].[TUser] Users
ON Review.[Entity_2_ID] = Users.[ID]
WHERE Review.[LocalTimeGenerated] > GETDATE() - 9 /* get the last 9 days */
AND Review.[Entity_3_ID] = '4503603922337793' /* id of the door? */
AND ( Users.[FirstName] + ' ' + Users.[SecondName] ) = '[username]'
ORDER BY [Fullname] ASC, [LocalDate] DESC
结果如下;
DayNum LocalDate FullName LastDoorEntered
8 2018-03-08 07:20:08.7370000 [username] Main Office Entrance
7 2018-03-07 08:15:31.5970000 [username] Main Office Entrance
6 2018-03-06 14:41:43.3230000 [username] Main Office Entrance
6 2018-03-06 08:52:15.9870000 [username] Main Office Entrance
5 2018-03-05 08:52:45.4170000 [username] Main Office Entrance
1 2018-03-01 14:43:12.7670000 [username] Main Office Entrance
1 2018-03-01 13:10:29.6400000 [username] Main Office Entrance
1 2018-03-01 12:18:57.1670000 [username] Main Office Entrance
1 2018-03-01 11:32:17.5970000 [username] Main Office Entrance
1 2018-03-01 10:43:04.2170000 [username] Main Office Entrance
1 2018-03-01 08:05:00.1530000 [username] Main Office Entrance
28 2018-02-28 15:19:22.4270000 [username] Main Office Entrance
28 2018-02-28 13:17:04.9100000 [username] Main Office Entrance
28 2018-02-28 12:06:50.3970000 [username] Main Office Entrance
28 2018-02-28 08:52:09.6600000 [username] Main Office Entrance
我遇到的麻烦是,我需要返回基于日期的分组结果(实际上,我每天只需要看到第一个条目)。 下面是结果需要的结果;
DayNum LocalDate FullName LastDoorEntered
8 2018-03-08 07:20:08.7370000 [username] Main Office Entrance
7 2018-03-07 08:15:31.5970000 [username] Main Office Entrance
6 2018-03-06 08:52:15.9870000 [username] Main Office Entrance
5 2018-03-05 08:52:45.4170000 [username] Main Office Entrance
1 2018-03-01 08:05:00.1530000 [username] Main Office Entrance
28 2018-02-28 08:52:09.6600000 [username] Main Office Entrance
我希望我可以只使用GROUP BY DayNum,但是显然您不能按别名分组。
无效的列名“ DayNum”。
将逻辑下移到GROUP BY子句也不起作用(...未包含在聚合函数或GROUP BY子句中)。
我尝试执行两个单独的SELECT,然后通过ID列将它们合并回去(在上面的示例中未使用),但没有成功。 使用“ 从表中选择多个列,但按一个分组”中显示的最大技巧绝不走运。
有什么方法可以使它起作用,还是在前端出现问题后我坚持这样做?
您不能按别名分组,但是在大多数SQL实现中, 可以按函数的输出分组。 只需group by DATEPART( day, Review.[LocalTimeGenerated] )
,它应该可以工作。
您当然需要将所有其他选择包装在聚合函数中(例如, min(Review.[LocalTimeGenerated]) AS LocalDate
)
您可以使用ROW_NUMBER
SELECT * FROM (
SELECT
DATEPART( day, Review.[LocalTimeGenerated] ) AS DayNum,
Review.[LocalTimeGenerated] AS LocalDate,
( Users.[FirstName] + ' ' + Users.[SecondName] ) AS FullName,
SUBSTRING(
Review.[Text],
PATINDEX(
'%into %',
Review.[Text]
) + 5,
50
) AS LastDoorEntered /* return only the door name */
, ROW_NUMBER() OVER(PARTITION BY CAST(Review.[LocalTimeGenerated] AS DATE) ORDER BY Review.[LocalTimeGenerated]) RN
FROM [LOGS].[dbo].[Review] Review
INNER JOIN [DATA].[dbo].[TUser] Users
ON Review.[Entity_2_ID] = Users.[ID]
WHERE Review.[LocalTimeGenerated] > GETDATE() - 9 /* get the last 9 days */
AND Review.[Entity_3_ID] = '4503603922337793' /* id of the door? */
AND ( Users.[FirstName] + ' ' + Users.[SecondName] ) = '[username]'
) T
WHERE RN = 1
ORDER BY [Fullname] ASC, [LocalDate] DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.