Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 按计数订购(someRecord)_Sql_Sql Server 2008 - Fatal编程技术网

Sql 按计数订购(someRecord)

Sql 按计数订购(someRecord),sql,sql-server-2008,Sql,Sql Server 2008,我有一个包含许多记录的表。这些列是目录、全名、服务器名。我想要一个查询来返回按目录列的重复值数量排序的记录列表 例如: Directory Full Name Server Name oneill Liam O'Neill server1 oneill Liam O'Neill server6 oneill Liam O'Neill server12 oneill Li

我有一个包含许多记录的表。这些列是目录、全名、服务器名。我想要一个查询来返回按目录列的重复值数量排序的记录列表

例如:

Directory      Full Name          Server Name
oneill         Liam O'Neill       server1
oneill         Liam O'Neill       server6
oneill         Liam O'Neill       server12
oneill         Liam O'Neill       server2
brown          Joe Brown          server4
brown          Joe Brown          server5
brown          Joe Brown          server2
walsh          Sarah Walsh        server1

您可以按的顺序直接使用它:

SELECT * FROM dbo.Directory d
ORDER BY (SELECT COUNT(*) FROM dbo.Directory d2
          WHERE d.Directory = d2.Directory) DESC


如果要按升序排序,请将
DESC
更改为
ASC
,以使重复次数较少的目录排在第一位。您的样本不太好,因为您已经按重复项(desc)对其进行了排序。

为此使用窗口函数:

select t.*, count(*) over (partition by Directory) as cnt
from table t
order by cnt desc;

你能告诉我们到目前为止你尝试了什么吗?你想要的结果与你的样本数据有什么不同?这取决于
目录中是否有索引。通常,相关子查询不需要总是每行执行一次。正如您在上面查询的查询计划中所看到的,流聚合也会按目录分组,即使有这个小样本数据:与简单的
SELECT COUNT(*)
sub查询相比,这里的窗口函数有什么好处?@TimSchmelter。优点是windows功能是专门为此目的设计的。它们应该更加优化(我并不是说它们实际上是优化的)。如果性能是一个问题,那么最好测试不同的版本。
select t.*, count(*) over (partition by Directory) as cnt
from table t
order by cnt desc;