为什么在GROUP BY子句中添加DATE类型的额外列会导致我的SQL查询返回额外的值?

时间:2017-08-23 19:46:50

标签: sql

在添加DATE列之前,我的查询如下所示:

SELECT DISTINCT 
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4
FROM 
    tbl1
INNER JOIN 
    tbl2 ON tbl1.val2 = tbl2.val5
WHERE 
    (tbl2.val6 = @param1)
    AND (tbl1.val3 >= GETDATE() - @param2
    AND tbl1.val3 <= GETDATE())
GROUP BY 
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4, 
    tbl2.val5, tbl2.val6, tbl2.val7, tbl2.val8, tbl2.val9, tbl2.val10

我得到了所需的行数。

DATE列添加到SELECTGROUP BY子句后,我的查询如下所示:

SELECT DISTINCT 
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4, tbl2.date
FROM
    tbl1
INNER JOIN 
    tbl2 ON tbl1.val2 = tbl2.val5
WHERE 
    (tbl2.val6 = @param1)
    AND (tbl1.val3 >= GETDATE() - @param2
    AND tbl1.val3 <= GETDATE())
GROUP BY 
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4, 
    tbl2.val5, tbl2.val6, tbl2.val7, tbl2.val8, tbl2.val9, 
    tbl2.val10, tbl2.date

除了日期之外我还有大量额外的行。

为什么会发生这种情况,有什么办法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

正如AaronDietz在对OP的评论中所述,日期列可能包含许多唯一值,这将导致返回的集对于每个唯一日期都是唯一的。

同样在评论中,OP描述他们想要最新的日期值。在这种情况下,您可以从分组中删除日期列,然后选择max(tbl2.date)。因为max()是一个返回组的单个值的聚合函数,所以每个分组的日期列中只有一个值,因此你不会得到所有&#34; extra&#34;行的唯一区别是日期列的值。

下面是查询示例,添加了max(date)。我还删除了查询的冗余/未使用部分。您不需要使用distinct,因为您已经进行了分组(您可以将其视为&#34;按所有列进行分组&#34;),您也不需要按列进行分组你没有选择。

SELECT
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4, max(tbl2.date) as date
FROM
    tbl1
INNER JOIN 
    tbl2 ON tbl1.val2 = tbl2.val5
WHERE 
    (tbl2.val6 = @param1)
    AND (tbl1.val3 >= GETDATE() - @param2
    AND tbl1.val3 <= GETDATE())
GROUP BY 
    tbl1.val1, tbl2.val1, tbl2.val2, tbl2.val3, tbl2.val4