我在表中有以下行:
C1 |C2 |C3 |C4
7 | 3 | 1 | 6
我想以这样一种方式构造查询,即为每列指定顺序;
O1 |O2 |O3 |O4
4 | 2 | 1 | 3
是否可以在单个查询中进行这种逐行比较?还是在声明时构造复杂案例的唯一选择?
编辑:我尝试绕过的情况:
case
when C1 = greatest ( C1, C2, C3, C4) then 1
when C1 >= C2 and C1 >= C3 and C1 < C4
or C1 >= C2 and C1 < C3 and C1 >= C4
or C1 < C2 and C1 >= C3 and C1 >= C4 then 2
when C1 >= C2 and C1 < C3 and C1 < C4
or C1 < C2 and C1 >= C3 and C1 < C4
or C1 < C2 and C1 < C3 and C1 >= C4 then 3
when C1 = least (C1, C2, C3, C4 ) then 4
end as O1
如果值相等,则索引确定顺序:如果C2 = C3,O2 = 1,O2 = 3。
如您所见,这很容易出错。有没有办法使这种比较更加优雅?
比较仅需要在单个行中进行,单个列的顺序不影响表中行的顺序。
编辑2:表中有多行用ID_ROW标识。
请您参考如下方法:
复杂的嵌套大小写-不需要时,可以使用“简单”的大小写-当有总和时(虽然有点乏味)
select t.*,
case when c1>c2 then 1 else 0 end
+ case when c1>c3 then 1 else 0 end
+ case when c1>c4 then 1 else 0 end + 1 as q1,
case when c2>c1 then 1 else 0 end
+ case when c2>c3 then 1 else 0 end
+ case when c2>c4 then 1 else 0 end + 1 as q2,
case when c3>c1 then 1 else 0 end
+ case when c3>c2 then 1 else 0 end
+ case when c3>c4 then 1 else 0 end + 1 as q3 ,
case when c4>c1 then 1 else 0 end
+ case when c4>c2 then 1 else 0 end
+ case when c4>c3 then 1 else 0 end + 1 as q4
FROM table1 t;
| c1 | c2 | c3 | c4 | q1 | q2 | q3 | q4 |
|----|----|----|----|----|----|----|----|
| 7 | 3 | 1 | 6 | 4 | 2 | 1 | 3 |
| 6 | 5 | 4 | 1 | 4 | 3 | 2 | 1 |




