基于排名的左连接SQL Server返回结果

基于排名的左连接SQL Server返回结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我在SQLServer2008中有一个一对多的左联接,需要根据查询中指定的优先级返回一行。为了清楚起见,假设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

我在SQLServer2008中有一个一对多的左联接,需要根据查询中指定的优先级返回一行。为了清楚起见,假设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
我想返回以下结果:

Station 1   A
Station 2   B
Station 3   C
Ie 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

但是,由于我将返回多行连接,我不确定如何处理,我还希望返回字符串,而不是指定的优先级。在此方面,我非常感谢您的帮助,请提前感谢您可以在函数的
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
分区内优先级最高的记录。它还返回
表2中的另一个字段

我认为您需要做的是使用Row_Number()函数来对订单进行排序。如果您有任何问题,请告诉我:


我认为还有更多的问题,因为您不需要使用您提供的详细信息进行连接:
从t2 group by station中选择station,min(…)
@Phylogenesis,是的,我将其精简为(尝试并)澄清感谢快速响应,我认为它在“case-when”之间遗漏了t2.mycol,但这肯定让我走上了正确的轨道-非常感谢!