Sql server tsql优化聚合字段的选择

Sql server tsql优化聚合字段的选择,sql-server,tsql,Sql Server,Tsql,我有一个任务来选择那些姓氏>=3的普通地址:例如123 Main 我分几个步骤编写了这个代码,只是想了解其他解决方案是什么,我认为它可以在一个步骤中完成,我使用的是SQL Server 2016 这个最小值/最大值将适用于2+个不同的名称,但对于3+我需要做更多的逻辑 ;WITH c AS ( SELECT 'Dow' LName, 'John' Fname, '123 Main' addr UNION SELECT 'Alexander' LName, 'Mik

我有一个任务来选择那些姓氏>=3的普通地址:例如123 Main

我分几个步骤编写了这个代码,只是想了解其他解决方案是什么,我认为它可以在一个步骤中完成,我使用的是SQL Server 2016

这个最小值/最大值将适用于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 

您可以使用COUNTDISTINCT一步完成,以获得不同的姓氏和组条件:

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

格尔茨·阿尔贝托,我只需要再加一个就可以了