修改查询以按客户标识符分组

时间:2019-01-23 04:12:36

标签: sql sql-server

我有以下查询。

基本查询

WITH CTE (clientid, dayZero)  
AS  
-- Define the CTE query.  
(  
SELECT
    clientid,
    DATEDIFF(
        DAY,
        MIN(calendar),
        MIN(CASE 
                WHEN total = 0 
                THEN calendar 
            END)     
    ) as dayZero
FROM (
    SELECT 
        clientid, 
        CONVERT(datetime, convert(varchar(10), calendar)) calendar,
        TOTAL
    FROM STATS s1
) a
GROUP BY clientid 
),
cteb as  
-- Define the outer query referencing the CTE name.  
(SELECT cte.*, c.company, v.Name, m.id as memberid
FROM CTE
JOIN client c
on c.id = cte.CLIENTID
join Domain v
on v.Id = c.domainID
join subscriber m
on m.ClientId = c.id
join activity a
on m.id = a.memberid
where c.id != 023
),
ctec as
(
select count(distinct memberid) as Number from cteb
group by clientid
)

select clientid, dayzero, company, name, Number from cteb , ctec

此查询的输出为-

clientid  dayzero   company            name     Number
21        35       School Boards    Education   214
21        35       School Boards    Education   214

我希望每个客户端仅返回1行。有关如何修改此查询的任何想法

子查询

    select count(distinct memberid) as Number from cteb
    group by clientid

当我只运行查询直到上述子查询并选择时-

select * from ctec
where clientid = 21

我知道

clientid   Number
21          214
22          423

这就是我想要的。但是,当我运行以下select来获取所需的所有其他列时,我开始获取重复项。输出有意义,因为我没有按clientid分组。但是,如果我groupby如何获得所需的其他列?

select clientid, dayzero, company, name, Number from cteb , ctec

更新

当我运行以下内容时,选择

select clientid, dayzero, company, name, Number from cteb , ctec
group by clientid, dayzero, company, name, Number

我还是

 clientid  dayzero  company            name     Number
    21        35       School Boards    Education   214
    21        35       School Boards    Education   215

我不明白为什么我在“数字”列中得到了不同的数字(本例中为214和215)。但是,当我按如下所示与group by一起运行时,我得到了正确的数字。

    select count(distinct memberid) as Number from cteb
    group by clientid

    select * from ctec
    where clientid = 21

我知道

clientid   Number
21          2190

214215都不正确。正确的数字是2190,当我如上所述分组时得到的数字。

1 个答案:

答案 0 :(得分:0)

如果您要显示基于特定列的唯一行,则可以像以下查询一样使用ROW_NUMBER()

select * from
(
select clientid, dayzero, company, name, Number, 
        ROW_NUMBER() OVER(PARTITION BY clientid ORDER BY Number DESC) RN
 from cteb , ctec
) t
where RN=1