Hem*_*rma 0 distinct where-clause sql-server-2008
我想获得特定列的不同值,但如果选择了3列以上,则不能正确管理duplicity.
查询是:
SELECT DISTINCT
ShoppingSessionId, userid
FROM
dbo.tbl_ShoppingCart
GROUP BY
ShoppingSessionId, userid
HAVING
userid = 7
Run Code Online (Sandbox Code Playgroud)
此查询产生正确的结果,但如果我们添加另一列,则结果是错误的.
请帮助我,因为我想使用ShoppingSessionIdas作为一个独特的,除非我想使用表中的所有列,包括使用该where子句.
我怎样才能做到这一点?
该DISTINCT关键字适用于整行,从不适用于列.
目前DISTINCT根本不需要,因为您的脚本已经确保它ShoppingSession是不同的:通过GROUP BY在另一个分组列中指定列并过滤(userid).
当您添加第三列GROUP BY并导致重复时ShoppingSession,这意味着某些ShoppingSession值与添加的列的许多不同值相关联.
如果要ShoppingSession在包含第三列后保持不同,则应确定应在输出中保留添加列的哪些值以及应丢弃哪些值.这称为聚合.您可以将该MAX()函数应用于该列,MIN()或任何其他合适的聚合函数.请注意,列应该不包含在GROUP BY这种情况下.
以下是我所说的内容的说明:
SELECT
ShoppingSessionId,
userid,
MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
GROUP BY
ShoppingSessionId,
userid
HAVING userid = 7
Run Code Online (Sandbox Code Playgroud)
您的查询还有一个注释.该HAVING子句通常用于对聚合列进行过滤.如果您的过滤器不涉及聚合列,则最好使用该WHERE子句:
SELECT
ShoppingSessionId,
userid,
MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
ShoppingSessionId,
userid
Run Code Online (Sandbox Code Playgroud)
虽然两个查询都会产生相同的结果,但它们的效率会有所不同,因为第一个查询必须拉出所有行,对它们进行分组/聚合,然后丢弃所有行userid = 7,但第二个将首先丢弃行,然后再分组/聚合剩下的,效率更高.
您可以更进一步,从userid列中排除该列GROUP BY并使用聚合函数拉取其值:
SELECT
ShoppingSessionId,
MAX(userid) AS userid,
MAX(YourThirdColumn) AS YourThirdColumn
FROM dbo.tbl_ShoppingCart
WHERE userid = 7
GROUP BY
ShoppingSessionId
Run Code Online (Sandbox Code Playgroud)
由于userid输出中的所有值都应该包含7(因为它在您的过滤器中),您可以为每个人选择一个最大值ShoppingSession,因为它知道它始终是7.