在 Vertica SQL 中,如何按小数精度排序?
In Vertica SQL, how do I order by decimal precision?
我有一列包含两种类型的数字。一种四舍五入到小数点后一位,另一种不四舍五入,因此具有很高的小数精度。我想按这些类型排序以分离数据。
数据如下所示:
column
------
12.8255089150483
12.8922181755615
12179.7
13.2379805518594
14612.2
15.3011111458778
我希望它看起来像这样:
column
------
12179.7
14612.2
12.8255089150483
12.8922181755615
13.2379805518594
15.3011111458778
这很难精确地做到,因为(大概)数字是一个浮点数。
对于您的示例,以下应该有效:
order by (case when cast(col as decimal(20, 1)) = cast(col as decimal(20, 10)
then 1 else 2
end)
这会将数字转换为定点格式,一个保留一位小数,一个保留10。如果它们相同,那么我们将它们放在排序顺序的第一位。
我要感谢戈登的聪明回答。这是我最终得到的对我有用的东西:
select rtp::varchar as rtp2
from table
order by (
case when split_part(ifnull(rtp,0)::varchar,'.',2) = ''
then 0
else split_part(ifnull(rtp,0)::varchar,'.',2)::int
end) desc
limit 100
;
如您所见,我还有一些空值需要处理。
我从这里得到了提示:
SQL select order by decimal precision desc
我看到我们已经有了两个很好的答案。添加第三种可能性:
select rtp from t1 order by ( 10*rtp - floor(rtp*10) ) ;
如果您希望数字末尾有一个小数位,您可以将 DESC 添加到 ORDER BY...
我有一列包含两种类型的数字。一种四舍五入到小数点后一位,另一种不四舍五入,因此具有很高的小数精度。我想按这些类型排序以分离数据。
数据如下所示:
column
------
12.8255089150483
12.8922181755615
12179.7
13.2379805518594
14612.2
15.3011111458778
我希望它看起来像这样:
column
------
12179.7
14612.2
12.8255089150483
12.8922181755615
13.2379805518594
15.3011111458778
这很难精确地做到,因为(大概)数字是一个浮点数。
对于您的示例,以下应该有效:
order by (case when cast(col as decimal(20, 1)) = cast(col as decimal(20, 10)
then 1 else 2
end)
这会将数字转换为定点格式,一个保留一位小数,一个保留10。如果它们相同,那么我们将它们放在排序顺序的第一位。
我要感谢戈登的聪明回答。这是我最终得到的对我有用的东西:
select rtp::varchar as rtp2
from table
order by (
case when split_part(ifnull(rtp,0)::varchar,'.',2) = ''
then 0
else split_part(ifnull(rtp,0)::varchar,'.',2)::int
end) desc
limit 100
;
如您所见,我还有一些空值需要处理。
我从这里得到了提示: SQL select order by decimal precision desc
我看到我们已经有了两个很好的答案。添加第三种可能性:
select rtp from t1 order by ( 10*rtp - floor(rtp*10) ) ;
如果您希望数字末尾有一个小数位,您可以将 DESC 添加到 ORDER BY...