【问题标题】:Group by records by date按日期按记录分组
【发布时间】:2014-01-31 21:26:55
【问题描述】:

我正在使用SQL Server 2008 R2。我有一个如下的数据库表:

+--+-----+---+---------+--------+----------+-----------------------+
|Id|Total|New|Completed|Assigned|Unassigned|CreatedDtUTC           |
+--+-----+---+---------+--------+----------+-----------------------+
|1 |29   |1  |5        |6       |5         |2014-01-07 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|2 |29   |1  |5        |6       |5         |2014-01-07 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|3 |29   |1  |5        |6       |5         |2014-01-07 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|4 |30   |1  |3        |2       |3         |2014-01-08 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|5 |30   |0  |3        |4       |3         |2014-01-09 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|6 |30   |0  |0        |0       |0         |2014-01-10 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+
|7 |30   |0  |0        |0       |0         |2014-01-11 06:00:00.000|
+--+-----+---+---------+--------+----------+-----------------------+

现在,grouping CreatedDtUTC 列的记录时,我遇到了一个奇怪的问题。

我想要这张表中的distinct records。在这里您可以观察到前三个记录是在同一日期时间创建的重复。我想要不同的记录,所以我运行了下面给出的查询:

SELECT  Id, Total, New, Completed, Assigned, Unassigned, MAX(CreatedDtUTC) 
FROM TblUsage 
GROUP BY CreatedDtUTC

但它给了我错误:

选择列表中的“TblUsage.Id”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我也为 CreatedDtUTC 列尝试了 DISTINCT,但给出了同样的错误。谁能让我知道如何摆脱这个?

附:我想要CONVERT(VARCHAR(10), CreatedDtUTC,101) 格式的CreatedDtUTC coumn。

【问题讨论】:

    标签: sql sql-server date select group-by


    【解决方案1】:

    试试这个…………

    SELECT  min(Id) Id, Total, New, Completed, Assigned, Unassigned, CreatedDtUTC
    FROM TblUsage 
    GROUP BY Total, New, Completed, Assigned, Unassigned, CreatedDtUTC
    

    【讨论】:

    • 感谢您的积极回复,+1。
    【解决方案2】:

    错误信息本身非常明确。如果一个列不是GROUP BY 的一部分,则不能在不对其应用聚合函数的情况下将其放入SELECT 子句中。背后的原因很简单,SQL Server 不知道您要选择组中该列的哪个值。它不是确定性的,因此被禁止。

    您可以将除Id 之外的所有列放在GROUP BY 中,然后在Id 上使用MIN()MAX(),或者您可以通过以下方式利用窗口函数ROW_NUMBER()

    SELECT Id, Total, New, Completed, Assigned, Unassigned, CONVERT(VARCHAR(10), CreatedDtUTC,101) CreatedDtUTC
      FROM
    (
      SELECT t.*, ROW_NUMBER() OVER (PARTITION BY Total, New, Completed, Assigned, Unassigned, CreatedDtUTC 
                                     ORDER BY id DESC) rnum
        FROM TblUsage t
    ) q
     WHERE rnum = 1
    

    输出:

    |身份证 |总计 |新 |已完成 |已分配 |未签名 |已创建DTUTC | |----|-------|-----|------------|----------|------- --|--------------| | 3 | 29 | 1 | 5 | 6 | 5 | 2014 年 1 月 7 日 | | 6 | 30 | 0 | 0 | 0 | 0 | 2014 年 1 月 10 日 | | 7 | 30 | 0 | 0 | 0 | 0 | 2014 年 1 月 11 日 | | 5 | 30 | 0 | 3 | 4 | 3 | 2014 年 1 月 9 日 | | 4 | 30 | 1 | 3 | 2 | 3 | 2014 年 1 月 8 日 |

    这里是SQLFiddle演示

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT MIN(Id) AS Id, Total, New, Completed, Assigned, Unassigned, 
             CONVERT(VARCHAR(10), CreatedDtUTC, 101) AS CreatedDtUTC
      FROM TblUsage 
      GROUP BY Total, New, Completed, Assigned, Unassigned, CreatedDtUTC
      

      查看SQL FIDDLE DEMO

      输出

      | ID | TOTAL | NEW | COMPLETED | ASSIGNED | UNASSIGNED | CREATEDDTUTC |
      |----|-------|-----|-----------|----------|------------|--------------|
      |  1 |    29 |   1 |         5 |        6 |          5 |   01/07/2014 |
      |  4 |    30 |   1 |         3 |        2 |          3 |   01/08/2014 |
      |  5 |    30 |   0 |         3 |        4 |          3 |   01/09/2014 |
      |  6 |    30 |   0 |         0 |        0 |          0 |   01/10/2014 |
      |  7 |    30 |   0 |         0 |        0 |          0 |   01/11/2014 |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        • 2015-09-15
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多