tsql优化选择聚合字段

时间:2017-10-25 21:26:40

标签: sql-server tsql

我有一项任务是选择具有> = 3个不同姓氏的公共地址:123为我的例子。

我在几个步骤中对此进行了编码,只想了解其他解决方案的内容,我认为可以单步执行,我在SQL Server 2016上。

这个Min / Max适用于2个以上不同的名字,但有3个以上我需要做更多的逻辑我认为

;WITH c AS 
(
    SELECT 'Dow' LName, 'John' Fname, '123 Main' addr  
    UNION 
    SELECT 'Alexander' LName, 'Mike' Fname, '123 Main' addr  
    UNION
    SELECT 'Sam' LName, 'Kent' Fname, '123 Main' addr  
    UNION 
    SELECT 'Marth' LName,  'Rose' Fname,'123 Main' addr  
    UNION 
    SELECT 'Xavier' LName, 'Rob' Fname, '9000 Metaxa St' addr  
    UNION 
    SELECT 'Xavier' LName,  'Mary' Fname,'9000 Metaxa St' addr  
    UNION 
    SELECT '__Xavier' LName,  'Lucricia' Fname,'9000 Metaxa St' addr  
    UNION 
    SELECT 'Xclude' LName, 'John' Fname, 'Kirov 2 St' addr 
)
, --  SELECT * FROM c
c2 AS 
(
    SELECT MIN(lname) nameMin, MAX(lname) nameMax, addr, COUNT(*) cc
    FROM c
    GROUP BY addr
)
SELECT * 
FROM c2 
WHERE nameMin <> nameMax AND cc >=3 

1 个答案:

答案 0 :(得分:2)

您可以使用COUNT(DISTINCT)一步一步获取不同的姓氏,并为组条件HAVING()执行此操作:

WITH c AS (
    SELECT 'Dow' LName, 'John' Fname, '123 Main' addr  UNION
    SELECT 'Alexander' LName, 'Mike' Fname, '123 Main' addr  UNION
    SELECT 'Sam' LName, 'Kent' Fname, '123 Main' addr  UNION
    SELECT 'Marth' LName,  'Rose' Fname,'123 Main' addr  UNION 
    SELECT 'Xavier' LName, 'Rob' Fname, '9000 Metaxa St' addr  UNION 
    SELECT 'Xavier' LName,  'Mary' Fname,'9000 Metaxa St' addr  UNION
    SELECT '__Xavier' LName,  'Lucricia' Fname,'9000 Metaxa St' addr  UNION 
    SELECT 'Xclude' LName, 'John' Fname, 'Kirov 2 St' addr 
)
SELECT addr, COUNT(DISTINCT LName) as LNameCount
FROM c
GROUP BY addr
HAVING COUNT(distinct LName)>=3