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