在添加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
除了日期之外我还有大量额外的行。
为什么会发生这种情况,有什么办法可以解决这个问题吗?
答案 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