具有优先级属性的表连接



>基本上,我有一个带有优先级属性和值的表,例如

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

最新更新