SQL Server 2016 在不重复查询的情况下将相似的行计为一列

标签 sql sql-server

我有一个返回类似于这个伪表的数据的 SQL 查询:

| Name | Id1 | Id2 | Guid |
|------+-----+-----+------|
| Joe  | 1   | 1   | 1123 |
| Joe  | 2   | 1   | 1123 |
| Joe  | 3   | 1   | 1120 |
| Jeff | 1   | 1   | 1123 |
| Moe  | 3   | 42  | 1120 |

我想在输出中显示一个附加列,列出与给定行具有匹配 GUID 的记录总数,如下所示:

| Name | Id1 | Id2 | Guid | # Matching |
+------+-----+-----+------+------------+
| Joe  | 1   | 1   | 1123 | 3          |
| Joe  | 2   | 1   | 1123 | 3          |
| Joe  | 3   | 1   | 1120 | 2          |
| Jeff | 1   | 1   | 1123 | 3          |
| Moe  | 3   | 42  | 1120 | 2          |

我能够通过将查询与自身连接起来并进行计数来完成此操作。但是,查询相当大并且需要一段时间才能完成,有没有什么方法可以在不将查询与自身连接的情况下完成此操作?

最佳答案

你想要一个窗口函数:

select t.*, count(*) over (partition by guid) as num_matching
from t;

关于SQL Server 2016 在不重复查询的情况下将相似的行计为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388454/

相关文章:

c# - 使用 LINQ 比较两个字段

sql-server - 获取 SQL Server 中所有系统数据库的列表

mysql - 为什么 SQLite 和 MySQL 在 subselect 上没有给出相同的结果?

sql - UNION 与 CROSS APPLY 性能

mysql - 如何选择两个连接的列?

mysql - 限制 SELECT 结果中长文本字段的长度

java - 如何在 Windows 身份验证和强制加密设置为 true 的情况下连接到 MSSQL Server

sql-server - NHibernate下SQL Server死锁

mysql - 如何制作自增INSERT INTO语句?

mysql - 在内部连接Mysql中找到最近的时间