不使用子查询的高级分组

时间:2009-06-09 05:32:30

标签: sql sql-server tsql

这是我的数据样本。

-ID-        -Rank-      -Type-      -Status-    -Amount-
1142474     2       Under Offer Approved    23
1148492     1       Present     Current     56
1148492     2       Under Offer Approved    3
2273605     1       Present     Current     24

如果ID相同,我只想要排名最高的记录。所以查询的最终结果。

-ID-        -Rank-      -Type-      -Status-    -Amount-
1142474     2       Under Offer Approved    23
1148492     1       Present     Current     56
2273605     1       Present     Current     24

现在要获取原始数据集是一项昂贵的操作,因此 希望想要按ID 执行组然后将排名再次加入到数据集中。因此查询需要以另一种方式完成其工作。

干杯 安东尼

5 个答案:

答案 0 :(得分:6)

这将有效:

with temp as (
select *, row_number() over (partition by id order by rank) as rownum
from table_name
)
select * from temp where rownum = 1

每个id会给出一个记录,其中rank代表最少的数字

答案 1 :(得分:2)

SELECT * FROM TheTable
WHERE 1 = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Rank DESC)

答案 2 :(得分:1)

select t1.id
       , t1.rank
       , t1.type
       , t1.status
       , t1.amount

from   my_table t1 

       left outer join my_table as t2 
       on t1.id = t2.id 
    and 
       t2.rank < t1.rank 

where  t2.id is null

答案 3 :(得分:0)

一般可用的选项包括:

  • 将图示的数据存储在临时表中,然后查询临时表。
  • 使用WITH子句定义复杂查询,然后让DBMS对查询进行排序。

WITH子句有效地允许您为子查询指定名称;如果可能的话,优化器将避免重新评估它。 TEMP表解决方案可能是最简单的。那将是ID和MIN(排名)的GROUP BY并加入回来。

答案 4 :(得分:0)

为什么数据集如此昂贵,我认为这里没什么特别复杂的。你有所需的索引,是使用它们的查询吗?统计数据是否过时了?