繁体   English   中英

将SQL Select的结果分组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM