基于排名的左连接SQL Server返回结果
我在SQLServer2008中有一个一对多的左联接,需要根据查询中指定的优先级返回一行。为了清楚起见,假设A是最重要的,其次是B,C 在我的表中,这些varchar字段是单词,不能按字母顺序排列,因此(我认为)我需要为每个字段分配一个数值基于排名的左连接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
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,但这肯定让我走上了正确的轨道-非常感谢!