左连接基于排名的SQL Server返回结果
问题描述:
我在SQL Server 2008中有一对多左连接,并且需要根据查询中分配的优先级返回一行。为了清楚起见,假设A是最重要的,然后是B,C ...左连接基于排名的SQL Server返回结果
在我的表中这些varchar字段是单词,并且不能按字母顺序排序,所以(我认为)我需要为每个分配一个数值。
Table1
Station 1
Station 2
Station 3
Table2
Station 1 User 1 A
Station 1 User 2 B
Station 1 User 3 A
Station 1 User 4 B
Station 1 User 5 B
Station 2 User 1 B
Station 2 User 2 F
Station 2 User 3 D
Station 2 User 4 S
Station 2 User 5 E
Station 3 User 1 D
Station 3 User 2 D
Station 3 User 3 D
Station 3 User 4 S
Station 3 User 5 C
我想返回以下结果:
Station 1 A
Station 2 B
Station 3 C
即是用于站1的最重要的,B对站2等
我的逻辑到目前为止是使用case,min并在声明中选择:
select t1.station
, min(
case
when A then 1
when B then 2
when C then 3
when D then 4
end
)
from table1.t1 left join table2.t2 on t1.station = t2.station
group by t1.station
但是,由于我使用连接返回多行,所以我不确定如何处理这一点,我也希望返回字符串,而不是优先分配。我会很感激这方面的一些帮助,在此先感谢
答
您可以将ROW_NUMBER
功能的ORDER BY
子句中使用CASE
表达:
select station, mycol
from (
select t1.station, t2.mycol,
ROW_NUMBER() OVER (PARTITION BY t1.station
ORDER BY CASE t2.mycol
WHEN A THEN 1
WHEN B THEN 2
WHEN C THEN 3
WHEN D THEN 4
end) AS rn
from table1.t1
left join table2.t2 on t1.station = t2.station) as t
where t.rn = 1
查询将挑选具有在每一个最优先的记录t1.station
分区。它还返回table2
的其他字段。
+0
感谢您的快速反应,我认为它错过了'case when'之间的t2.mycol,但这绝对让我走上正轨 - 非常感谢! – User632716
答
我相信你需要做的就是使用Row_Number()函数来排列你的订单。让我知道如果您有任何疑问:
我想有更多的这一点,因为你并不需要与您提供的信息联接:'选择站,分(。 ..)从t2组通过电台;' – Phylogenesis
@Phylogenesis,是的,我把它缩小到(尝试)并给出一些清晰度 – User632716