>基本上,我有一个带有优先级属性和值的表,例如
TargetID Priority_Column (int) Value_column
1 1 "value 1"
1 2 "value 2"
1 5 "value 5
2 1 "value 1"
2 2 "value 2"
我想用这个表连接另一个表,
ID Name
1 "name 1"
2 "name 2"
但仅使用优先级最高的行。
结果会像
TargetID Priority_Column (int) Name Value_column
1 5 "name 1" "value 5"
2 2 "name 2" "value 2"
我当然可以使用像python这样的高级语言来计算每个ID的最高优先级行。
但这看起来效率低下,有没有办法直接在 sql 中做到这一点?
这有几个选项。 这是一个使用row_number
:
select *
from anothertable a join (
select *, row_number() over (partition by targetid order by priority desc) rn
from yourtable) t on a.id = t.targetid and t.rn = 1
是使用 outer apply
:
select t2.*, t1.*
from table2 t2 outer apply
(select top 1 t1.*
from table1 t1
where t2.id = t1.targetid
order by priority desc
) t1;
我应该指出,在SQL Server中,这通常是最有效的方法。 它将很好地利用table1(targetid, priority)
上的索引。
理解正确 您的问题 - 您想要第二个表中的"Max By"..
这是其中的示例https://stackoverflow.com/a/18694271/444149
如果我正确理解你在问什么,你可以写一个sql查询,在那里你会相应地获得max()优先级或min()优先级。
在您的情况下,将最大优先级作为必需结果,查询应为:
select a.TargetID, a.[Value_column], b.ID, b.Name
from TableA a
join TableB b
on a.TargetID = b.ID
where a.Priority_Column = (select max(z.Priority_Column) from TableA z
and z.ID = a.TargetID)
。编辑以反映您的结果集
SELECT TargetID,
Priority_Column,
Name,
Value_Column
FROM (SELECT t1.TargetID,
t1.Priority_Column,
t2.Name,
t1.Value_column,
ROW_NUMBER() OVER (PARTITION BY TargetID ORDER BY Priority_Column DESC) Rn
FROM Table1 t1
JOIN Table2 t2 ON t1.TargetId = t2.ID
) t
WHERE Rn = 1