我有一个配置单元表(myu表),它是orc格式的,有30列。其中两列(col\u us,col\u ds)存储数值,这些数值可以是0、null或某个整数。这张table是按天和小时划分的。这个表在一个days分区中有大约800万x 96条记录,我指的是15个daily分区
目前,我正在运行单独的查询,以使用rank函数检索值大于0的前500条记录。一个查询用于检索列,另一个查询用于检索列
当col\u ds为0或null时,clo\u us可能有一个数值
问题:我想从一个查询中从这些列中的每一列中检索前500个非null和非0记录。
我的问题:
From(
SELECT D.COL_US, D.DATESTAMP,
ROW_NUMBER() OVER (PARTITION BY D.ID,D.SUB_ID ORDER BY CONCAT (D.DATESTAMP,D.HOURSTAMP,D.TIMESTAMP) DESC) AS RNK
FROM ${wf_table_name} D
WHERE DATESTAMP >= '${datestamp_15}' AND DATESTAMP < '${datestamp}'
AND COL_US > 0)T
INSERT OVERWRITE TABLE ${wf_us_table}
SELECT T.COL_US, T.DATESTAMP, T.RNK WHERE T.RNK < 500;
1条答案
按热度按时间nimxete21#
根据您的查询,我可以猜测您正在尝试根据日期/时间从表中获取前500行,这意味着最近500行中的列us、列ds都有一个大于0的值,但不是这些列中的前500行。根据您的问题,您的表可能有两种类型的值。例如。
科卢乌斯
0
无效的
10
5
列
5
10
0
无效的
或者两列的值都大于0。因此,在where子句下使用'and(col\u us>0 and col\u ds>0',而不是'and col\u us>0',但是在这个条件下,您将无法从上述4行中获得任何值。所以如果你想从colu us得到10,5,再加上5,10 colu d,那么我应该说用一个查询是不可能的。
同样,根据您提出的问题“我想从一个查询中从这些列中的每一列中检索前500个非空和非0记录”,我可以猜您想从col\u us中获取前500个记录,col\u ds取决于col\u us/col\u ds的值,那么您必须在rank子句中使用这些列,而不是日期/时间。
根据其他可用列的不同,您可以通过更新查询来获取要检索的内容,但在此之前,我想请求您确切地共享所需内容(基于列/列的前500名或最新500名)以及基本表和目标表结构。