左连接基于排名的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 

但是,由于我使用连接返回多行,所以我不确定如何处理这一点,我也希望返回字符串,而不是优先分配。我会很感激这方面的一些帮助,在此先感谢

+0

我想有更多的这一点,因为你并不需要与您提供的信息联接:'选择站,分(。 ..)从t2组通过电台;' – Phylogenesis

+0

@Phylogenesis,是的,我把它缩小到(尝试)并给出一些清晰度 – User632716

您可以将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()函数来排列你的订单。让我知道如果您有任何疑问:

https://msdn.microsoft.com/en-us/library/ms186734.aspx

https://msdn.microsoft.com/en-us/library/ms189461.aspx