我在Hive中创建了一个表,我在其中将Order_id字段定义为String。但它有整数值。
现在,当我运行以下SQL时,结果不正确。
select * from orders_string2 Order by order_id limit 10;
1 2013-07-25 00:00:00.0 11599 CLOSED
10 2013-07-25 00:00:00.0 5648 PENDING_PAYMENT
100 2013-07-25 00:00:00.0 12131 PROCESSING
1000 2013-07-30 00:00:00.0 2321 CLOSED
10000 2013-09-25 00:00:00.0 8983 PROCESSING
10001 2013-09-25 00:00:00.0 316 PENDING_PAYMENT
10002 2013-09-25 00:00:00.0 1530 COMPLETE
10003 2013-09-25 00:00:00.0 8099 COMPLETE
10004 2013-09-25 00:00:00.0 7768 CLOSED
10005 2013-09-25 00:00:00.0 541 COMPLETE
以下SQL给出了正确的结果:
select * from orders_string2 order by int(order_id) limit 10;
1 2013-07-25 00:00:00.0 11599 CLOSED
2 2013-07-25 00:00:00.0 256 PENDING_PAYMENT
3 2013-07-25 00:00:00.0 12111 COMPLETE
4 2013-07-25 00:00:00.0 8827 CLOSED
5 2013-07-25 00:00:00.0 11318 COMPLETE
6 2013-07-25 00:00:00.0 7130 COMPLETE
7 2013-07-25 00:00:00.0 4530 COMPLETE
8 2013-07-25 00:00:00.0 2911 PROCESSING
9 2013-07-25 00:00:00.0 5657 PENDING_PAYMENT
10 2013-07-25 00:00:00.0 5648 PENDING_PAYMENT
现在,当我运行以下SQL时,我预计结果不正确。但它运作良好。
select * from orders_string2 where order_id > 100 limit 10;
101 2013-07-25 00:00:00.0 5116 CLOSED
102 2013-07-25 00:00:00.0 8027 COMPLETE
103 2013-07-25 00:00:00.0 12256 PROCESSING
104 2013-07-25 00:00:00.0 7790 PENDING_PAYMENT
105 2013-07-26 00:00:00.0 8220 COMPLETE
106 2013-07-26 00:00:00.0 395 PROCESSING
107 2013-07-26 00:00:00.0 1845 COMPLETE
108 2013-07-26 00:00:00.0 12149 PROCESSING
109 2013-07-26 00:00:00.0 9345 PENDING_PAYMENT
110 2013-07-26 00:00:00.0 2746 COMPLETE
这个也很好,不需要铸造。 从orders_string2中选择count(*),其中order_id> 100 68783
有人可以说明这个吗?为什么WHERE和SORT BY子句的工作方式不同?
答案 0 :(得分:0)
在SQL中,字符串按字母顺序排序。因此," 1"," 10"和" 100"所有人都来自" 2",就像" a"," ab"和" abc"所有人都来自" b"。这解释了前两个问题。
运行此查询时:
df.unstack().fillna(0).astype(int).stack()
你没有select *
from orders_string2
where order_id > 100
limit 10;
。可以返回与order by
条件匹配的任何10条记录。你是幸运的"他们是你期望的人。
如果您添加where
,那么您将获得一个不同的设置,基于您问题中的数据。