,如果你想获得的所有客户的所有位置与一个以上的位置,您应该使用一个窗口函数:
SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC
FROM (
SELECT CU_NO, LOC_NO, COUNT(LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC
FROM MYTABLE
) AS t
WHERE t.NUMBEROCC > 1
如果你不关心的所有位置,但只是客户ID,那么你可以通过子句中使用单群:
SELECT CU_NO
FROM MYTABLE
GROUP BY CU_NO
HAVING COUNT(DISTINCT LOC_NO) > 1
但您CU_NO想组这两种情况下,不LOC_NO!
窗口函数的SQL Server实现还没有(还)!COUNT(DISTINCT x) OVER(PARTITION BY x)
。所以,这会引发错误:
SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC
FROM (
SELECT CU_NO, LOC_NO
, COUNT(DISTINCT LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC
FROM MYTABLE
) AS t
WHERE t.NUMBEROCC > 1
解决方法是使用DENSE_RANK() OVER()
和MAX() OVER()
有一个额外的查询级别:
SELECT x.CU_NO, x.LOC_NO, x.NUMBEROCC
FROM (
SELECT t.CU_NO, t.LOC_NO
, MAX(DR) OVER(PARTITION BY CU_NO) AS NUMBEROCC
FROM (
SELECT CU_NO, LOC_NO
, DENSE_RANK() OVER (PARTITION BY CU_NO ORDER BY LOC_NO) AS DR
FROM MYTABLE
) AS t
) AS x
WHERE x.NUMBEROCC > 1
谢谢Ypercube和Petar – icecurtain