【发布时间】:2013-01-10 15:16:59
【问题描述】:
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
我尝试过滤以上数据以仅获取每个 projectId 具有 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 或任何东西。视图中提供的数据是为计划应用程序提供数据,运行时非常重要。我不想挣扎,以性能昂贵的视图选择结束。
上面的“原始数据”是一个视图结合了几十个表的数据的结果。我正在寻找一种方法来一次性过滤此视图的创建语句中的分组最大值,而无需在其间放置额外的层或视图!
【问题讨论】:
-
如果“原始数据”是一个视图而不是一个基表,我认为没有人可以提供关于性能的最佳答案。如果没有实际的查询/视图、表的定义和索引,这只是猜测。
标签: sql sql-server sql-server-2008 tsql