获得每组最大值(get max values per group)

2019-10-17 14:12发布

原始数据的结果create view "data" as select [...]声明:

projectId   resourceId  num

1052785922  318153743   10
1052785922  318153743   20
1052785922  318153743   30

1052785936  -2097765361 20
1052785936  318153743   10
1052785936  528513104   30

1052786014  -2097765361 20
1052786014  318153743   10
1052786014  528513104   30

1052786021  -2097765361 20
1052786021  318153743   10
1052786021  528513104   30

1052786099  -2097765361 20
1052786099  318153743   10

我尝试了上述数据进行过滤,仅每个专案编号MAX(NUM)获得的那些行。

预计结果:

projectId   resourceId  num

1052785922  318153743   30
1052785936  528513104   30
1052786014  528513104   30
1052786021  528513104   30
1052786099  -2097765361 20

我知道有多大的可能性,以自左连接上num = max(num)窗口功能类似max(num) over ( partition by projectId )或CTE,但我不知道是否有任何其他的可能性,只选择那些具有最高值NUM。

背景:以上数据只是一个大视图,这是相对复杂的光斑。 既然是一个观点,我不会去想的CTE或任何这样的。 在视图中提供的数据是养活规划,应用程序和运行是非常重要的。 我不wan't奋斗,在性能上昂贵的视图选择结束。

上述“原始数据”,是从几十个表组合数据的图的结果。 我正在寻找一种方式来过滤直接一杆分组最大值在该视图的创建语句,而不必把一个额外的层或查看之间!

Answer 1:

像这样:

WITH CTE
AS
(
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY projectId ORDER BY num DESC) rownum
  FROM Table1
)
SELECT projectId,   resourceId,  num
FROM CTE
WHERE rownum = 1;

SQL小提琴演示

这会给你:

|  PROJECTID |  RESOURCEID | NUM |
----------------------------------
| 1052785922 |   318153743 |  30 |
| 1052785936 |   528513104 |  30 |
| 1052786014 |   528513104 |  30 |
| 1052786021 |   528513104 |  30 |
| 1052786099 | -2097765361 |  20 |


Answer 2:

这个巨型脚本不使用排序;)尝试

SELECT *
FROM dbo.test3 t 
WHERE EXISTS (
              SELECT 1
              FROM dbo.test3                              
              WHERE projectId = t.projectId
              GROUP BY projectId
              HAVING MAX(num) = t.num
              )

演示上SQLFiddle



Answer 3:

我已经做到了创建从该视图中选择UDF对数据进行预处理马哈茂德应该做的方式。 UDF允许我使用临时表分别代替CTE可最终执行多次。

感谢所有的提示!



文章来源: get max values per group