Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为sql中的每个公司和域分配最大公司数_Sql_Sql Server_Max - Fatal编程技术网

为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