我有一个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 |
我能够通过将查询与自身连接并进行计数来实现此目的。但是,查询量很大,需要一段时间才能完成,是否有任何方法可以在不将查询本身加入的情况下完成此操作?
答案 0 :(得分:6)
您想要一个窗口功能:
select t.*, count(*) over (partition by guid) as num_matching
from t;