Sql server 如何添加一个新列,该列将计算特定列中重复值的数量
我想添加一个新列,该列将计算特定列中重复值的数量,并在表的第一个出现行中显示计数结果。 例如,拥有下面的玩具桌:Sql server 如何添加一个新列,该列将计算特定列中重复值的数量,sql-server,Sql Server,我想添加一个新列,该列将计算特定列中重复值的数量,并在表的第一个出现行中显示计数结果。 例如,拥有下面的玩具桌: ID LOGIN NAME COUNTRY 11 a@com Aron USA 12 a@com Aron Israel 13 ff@com Lucci Germany 我想在表的第一个出现行中获取登录字段的计数: ID LOGIN NAME COUNTRY Count_LOGIN 11 a@com Aron USA 2 12 a@com Ar
ID LOGIN NAME COUNTRY
11 a@com Aron USA
12 a@com Aron Israel
13 ff@com Lucci Germany
我想在表的第一个出现行中获取登录字段的计数:
ID LOGIN NAME COUNTRY Count_LOGIN
11 a@com Aron USA 2
12 a@com Aron Israel
13 ff@com Lucci Germany 1
我怎么做?
我知道我可以将表保存为临时表,然后执行下面所述的操作,但这并不完全是我需要的
SELECT LOGIN , COUNT(*) TotalCount
FROM #tt -- #tt is the first table
GROUP BY LOGIN
ORDER BY COUNT(*) DESC
首先,您可以使用
altertable
添加新列Count\u LOGIN
。然后,使用带有子查询的UPDATE
语句填充该列。你问题中的查询看起来正好是你想要的
ALTER TABLE #tt
ADD Count_LOGIN int;
UPDATE #tt
SET Count_LOGIN =
(
SELECT COUNT(*)
FROM #tt b
WHERE #tt.LOGIN = b.LOGIN
GROUP BY LOGIN
)
更新:
id loginn name cntry duplicate
11 a@com Aron USA 2
12 a@com Aron Israel 0
13 ff@com Lucci Germany 1
假设您只想更新具有最小ID
值的每个LOGIN
组的记录,您可以尝试以下joinupdate
查询:
UPDATE #tt
SET #tt.Count_LOGIN = t.TotalCount
FROM #tt
INNER JOIN
(
SELECT LOGIN, MIN(ID) AS ID, COUNT(*) AS TotalCount
FROM #tt
GROUP BY LOGIN
) t
ON #tt.ID = t.ID AND #tt.LOGIN = t.LOGIN
此查询只会影响原始#tt
表中与每个登录
组的最小ID
值匹配的记录。这将使该组中的其他记录没有值
create table #temp
(
id int,
loginn varchar(10),
name varchar(10),
cntry varchar(40)
)
insert into #temp
select
11, 'a@com', 'Aron', 'USA' union all
select 12, 'a@com', 'Aron', 'Israel' union all
select 13, 'ff@com', 'Lucci', 'Germany'
;with cte
as
(
select *,ROW_NUMBER() over (partition by loginn order by id) as rn
from #temp
)
select
id,loginn,name,cntry,
case
when rn=1 then (select count(*) from cte t1 where t1.loginn=t2.loginn)
else 0
end as duplicate
from
cte t2
输出:
id loginn name cntry duplicate
11 a@com Aron USA 2
12 a@com Aron Israel 0
13 ff@com Lucci Germany 1
您可以尝试使用窗口函数获取计数并决定何时显示结果
SELECT
Id
, Login
, Name
, Country
, COUNT(*) OVER (PARTITION BY Login) as Cnt
, CASE WHEN 1 = ROW_NUMBER() OVER (PARTITION BY Login ORDER BY Id) -- (Order by need to match query Order statement)
THEN COUNT(*) OVER (PARTITION BY Login) as Cnt
ELSE NULL
END AS Cnt_ONLY_ON_FIRST_RECORD
FROM #tt
ORDER BY
ID -- (Order by need to match Order in CASE condition statement)
问:为什么Israel没有一个登录名的值?这是因为登录名字段很重要,我希望看到每个登录名的行数,并且只在第一行显示该值。可能要添加和TotalCount>=1,根据上面的示例,当count为0时,似乎不应进行更新。感谢@Tim Biegeleisen,我收到一个无效列名“count\u LOGIN”的错误@MQL4初学者对于语法错误,我已更新了我的答案。感谢@Tim Biegeleisen,非常好的解决方案。有没有办法只让第一行显示输出表示例中的重复数?@mql4初学者我再次更新,这次使用了一个连接查询,我相信它可以给出您想要的确切结果。