左连接 SQL Server 根据排名返回结果

Use*_*716 3 sql sql-server sql-server-2008

我在 SQL Server 2008 中有一个一对多左连接,需要根据查询中分配的优先级返回一行。为了清楚起见,假设 A 是最重要的,其次是 B、C……

在我的表中,这些 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
Run Code Online (Sandbox Code Playgroud)

我想返回以下结果:

Station 1   A
Station 2   B
Station 3   C
Run Code Online (Sandbox Code Playgroud)

即 A 对于站点 1 最重要,B 对于站点 2 最重要,依此类推。

到目前为止,我的逻辑是在语句中使用 case、min 和 select:

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
Run Code Online (Sandbox Code Playgroud)

但是,由于我使用连接返回多行,所以我不确定如何处理这个问题,我也希望返回字符串,而不是分配的优先级。我希望得到一些帮助,提前致谢

Gio*_*sos 5

CASE您可以在函数ORDER BY的子句中使用表达式ROW_NUMBER

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
Run Code Online (Sandbox Code Playgroud)

查询将选择每个t1.station分区内具有最高优先级的记录。它还返回来自 的另一个字段table2