在添加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
列添加到SELECT
和GROUP 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
我得到了一大堆额外的行,除了日期之外都是一样的。
为什么会发生这种情况,有什么办法可以解决这个问题吗?
发布于 2017-08-23 20:01:56
正如AaronDietz在他对OP的评论中所描述的那样,date列可能包含许多唯一的值,这将导致返回的集合对于每个唯一的日期是唯一的。
同样在注释中,OP描述他们想要日期的最新值。在这种情况下,您可以从分组中删除date列,然后选择max(tbl2.date)
。因为max()是一个为组返回单个值的聚合函数,所以每个分组的date列中只有一个值,因此您不会得到所有的“额外”行,它们的唯一区别就是date列的值。
下面是一个查询示例,其中添加了max(日期)。我还删除了查询中多余/未使用的部分。您不需要使用distinct
,因为您已经在进行分组(您可以将distinct看作是"group by all columns"),也不需要按照您没有选择的列进行分组。
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
https://stackoverflow.com/questions/45848166
复制相似问题