我有一个表,我需要返回大约14列的值,但对于某些列的重复项仅返回1行。
第二个问题是,在重复项之间,我需要将int最大的列保留在不需要唯一的一列中。
由于表格很大,我正在寻求以最有效的方式进行此操作的建议。
我应该分组吗?
我的表有点像这样,我将简化列数。
ID(UniqueIdentifier) | ACCID(UniqueIdentifier) | DateTime(DateTime) | distance(int)|type(int)
28761188-0886-E911-822F-DD1FA635D450 1238FD8A-BD00-411A-A81C-0F6F5C026BCC 2019-06-03 14:04:41.000 2 3
41761188-0886-E911-822F-DD1FA635D450 1238FD8A-BD00-411A-A81C-0F6F5C026BCC 2019-06-03 14:04:41.000 1 3
我应该只选择ACCID和DATETIME是唯一的,主列中的列ID永远不会重复,并且我需要使行保持最大距离。
答案 0 :(得分:0)
您可以使用ROW_NUMBER()
窗口函数,如下所示:
select *
from (
select
id,
accid,
datetime,
distance,
type,
row_number() over(partition by accid, datetime order by type desc) as rn
from t
) x
where rn = 1
如果要显示多个“纽带”,请用ROW_NUMBER()
替换RANK()
。
答案 1 :(得分:0)
我建议将索引正确的相关子查询作为最快的方法:
select t.*
from t
where t.id = (select top (1) t2.id
from t t2
where t2.ACCID = t.ACCID
order by t2.distance desc
) ;
最佳索引位于(ACCID, distance desc, id)
。