2014-01-13 157 views
1

我正在使用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| 
+--+-----+---+---------+--------+----------+-----------------------+ 

现在,我通过CreatedDtUTC柱面临一个奇怪的问题,而grouping记录。

我想要这张表中的distinct records。在这里您可以观察到前三个记录是重复记录在相同的日期时间创建的。我想不重复的记录,所以我已经跑了查询如下:

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

但它给我的错误:

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

我也尝试了DISTINCT for CreatedDtUTC列,但给出了同样的错误。任何人都可以让我知道如何摆脱这个?

P.S.我想用CONVERT(VARCHAR(10), CreatedDtUTC,101)格式的CreatedDtUTC coumn。

回答

1

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

您可以把所有的列,除了IdGROUP BYId使用MIN()MAX()或者您可以利用下列方式

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 

输出窗函数ROW_NUMBER()

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

这里是SQLFiddle演示

+0

完成!非常感谢:D – Dev

2

试试这个............

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

谢谢+1您回应可观。 – Dev

0

试试这个:

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 |