我甚至不确定是否可以这样做,但我想根据三列中的一列的最大值来订购查询。
示例表结构: guid,column1,column2,column3
第1-3列有数值,我想根据最大值1,2或3对select语句进行排序。
例如:
record column1 column2 column3
---------------------------------
1 5 0 2
2 2 0 6
3 0 1 2
将命令记录2,1,3,因为6是三个记录中三个字段的最大值,记录1是第二个,记录3是第三个。
这有意义吗?
感谢。
答案 0 :(得分:3)
可能可以在选择查询中执行(可能使用类似case when
的内容,但我不确定order by
子句本身是否允许,YMMV取决于在DBMS上)但是如果你希望你的数据库随着桌子越来越大而扩展(“在赛马中没有单腿猪的表现”,那么使用每行计算很少是一个好主意,作为我们的一个DBA雄辩地说出来。)
在这种情况下,我设置了一个额外的(索引的)列来保持最大值并确保通过使用插入/更新触发器来强制保持数据完整性,以强制该新列到其他三个列的最大值。 / p>
因为大多数数据库表的读取频率远高于写入数据库,所以这会在所有读取中分摊计算成本。只有在您更新数据并且查询变得非常快时才会承担成本,因为您在单个索引列上进行了订购:
select f1, f2, f3 from t order by fmax desc;
答案 1 :(得分:1)
如上所述here,你想要的是GREATEST功能的等价物。
如果没有,假设您已定义UDF LargerOf以返回两个数字中的最大值,请使用
SELECT *
FROM Table
ORDER BY LargerOf(LargerOf(column1, column2), column3)
答案 2 :(得分:1)
create table myTable
(column1 int, column2 int, column3 int)
go
insert into myTable
values (5, 0 , 2)
go
insert into myTable
values (2, 0 , 6)
go
insert into myTable
values (0, 1 , 2)
go
select *
from mytable
order by case when column1 > column2 and column1 > column3 then column1
when column2 > column3 then column2
else column3 end desc