为sql中的每个公司和域分配最大公司数
我试图在图像中实现输出 我可以获得公司、域和域计数,但不确定如何添加显示具有最大域计数的公司名称的最后一列 到目前为止:为sql中的每个公司和域分配最大公司数,sql,sql-server,max,Sql,Sql Server,Max,我试图在图像中实现输出 我可以获得公司、域和域计数,但不确定如何添加显示具有最大域计数的公司名称的最后一列 到目前为止: SELECT company, RIGHT(email, LEN(email) - CHARINDEX('@', email)) as Domain, count(RIGHT(email, LEN(email) - CHARINDEX('@', email))) as Count_of_Domain FROM table where
SELECT company,
RIGHT(email, LEN(email) - CHARINDEX('@', email)) as Domain,
count(RIGHT(email, LEN(email) - CHARINDEX('@', email))) as Count_of_Domain
FROM table
where company <> ''
and email <> ''
and company <> 'NULL'
group
by company,
RIGHT(email, LEN(email) - CHARINDEX('@', email))
您可以使用子查询,在该子查询中,您只选择按计数降序排列的最顶层行。如果你也使用CTE,你不必重复那么多
WITH cte
AS
(
SELECT company,
right(email, len(email) - charindex('@', email)) as domain,
count(right(email, len(email) - charindex('@', email))) as count_of_domain
FROM table
WHERE company <> ''
AND email <> ''
AND company <> 'NULL'
GROUP company,
right(email, len(email) - charindex('@', email))
)
SELECT company,
domain,
count_of_domain,
(SELECT TOP 1
company
FROM cte
ORDER BY count_of_domain DESC) company_with_max_domain_count
FROM cte;
编辑:以上原始问题已回答
如果您只想显示某个域的顶级公司,而不是总的顶级公司,请在子查询中筛选该域
WITH cte
AS
(
SELECT company,
right(email, len(email) - charindex('@', email)) as domain,
count(right(email, len(email) - charindex('@', email))) as count_of_domain
FROM table
WHERE company <> ''
AND email <> ''
AND company <> 'NULL'
GROUP company,
right(email, len(email) - charindex('@', email))
)
SELECT c1.company,
c1.domain,
c1.count_of_domain,
(SELECT TOP 1
c2.company
FROM cte c2
WHERE c2.domain = c1.domain
ORDER BY c2.count_of_domain DESC) company_with_max_domain_count
FROM cte c1;
我想我应该使用窗口函数来编写:
select company, domain, count_of_domain,
max(case when seqnum = 1 then company end) over (partition by domain) as company_with_max_domain
from (select t.company, v.Domain, count(*) as Count_of_Domain,
row_number() over (partition by v.domain order by count(*) desc) as seqnum
from table t cross apply
(values (RIGHT(email, LEN(email) - CHARINDEX('@', email))) ) v(domain)
where t.company <> '' and t.email <> '' and t.company <> 'NULL'
group by t.company, v.domain
) cd
我试着做以下几件事:公司领域领域领域计算公司与最大领域计算A abc.com 8 E B abc.com 6 E C abc.com 4 E D abc.com 3 E abc.com 12EHelp us帮助您-请共享表格结构,一些示例数据和您尝试获取的此示例的结果。我正在尝试实现此结果:公司域计数\u of_Domain Company\u with_max_Domain\u Count A abc.com 4 E B abc.com 6 E C abc.com 8 E D abc.com 10 E D abc.com 12 EI可以使用以下方法获取前3列:选择公司、RIGHTemail、LENemail-CHARINDEX'@',email as Domain,countRIGHTemail,LENemail-CHARINDEX'@',从公司和电子邮件以及公司“NULL”按公司分组的表中将电子邮件作为\u域的计数,RIGHTemail,LENemail-CHARINDEX'@',email这是一个非常好的资源,可用于改进SQL问题:我保证,如果您遵循该指南,至少从Mureinik的观点来看,你会得到更快速、更准确的答案。这个查询对我来说不起作用,我通过“company_with_max_domain_count”一栏中的记录得到了相同的公司名称。@Mili:这就是你在写的图片中的内容,我正在尝试在图片中实现输出。在下面因此,在这方面,我的查询似乎非常适合您。此查询适用于一个域,但我有多个域,查询的“前1”部分将具有最大域数的公司名称分配给每个域。我想在每个域内的最大域数的公司。我会编辑图像,如果它不清楚。很抱歉造成混淆。@Mili:请参阅我的编辑。请尝试一下。我有非常大的数据,因此查询已经运行了22分钟。它给我的错误是:Msg 207,16级,状态1,第11行无效的列名“域”。这是完美的工作。我之前收到了域错误,因为在脚本中,您在第4行编写了t.domain,它需要被称为v.domain。但它现在运行良好,查询只需几秒钟即可执行。非常感谢你的帮助Gordon Linoff