2016-10-02 62 views
0

下表考慮蜂房如何計算比Hive表中的特定行更小的行?

+------+------+ 
| id | res | 
+------+------+ 
| 1 | 55 | 
| 2 | 10 | 
| 3 | 89 | 
| 4 | 100 | 
| 5 | 80 | 
| 6 | 55 | 
| 7 | 70 | 
| 8 | 35 | 
| 9 | 46 | 
| 10 | 51 | 
+------+------+ 

現在,我必須計算其比在一個特定的行中的RE值較小的行數。

對於上述表中的輸出應該是

+------+------+ 
| id |count | 
+------+------+ 
| 1 | 4 | 
| 2 | 0 | 
| 3 | 8 | 
| 4 | 9 | 
| 5 | 7 | 
| 6 | 4 | 
| 7 | 6 | 
| 8 | 1 | 
| 9 | 2 | 
| 10 | 3 | 
+------+------+ 

回答

3

你可以試試RANK OVER功能。

樣品Hiveql

select 
    id, 
    res, 
    rank() over (ORDER BY res) as rank 
from 
    my_table 
order by 
    res 

更多herehere

+0

???您的查詢返回:'(2,10,1)(8,35,2)(9,46,3)(10,51,4)(1,55,5)(6,55,5)(7, 70,7)(5,80,8)(3,89,9)(4,100,10)',這不是想要的結果。 您是否運行了查詢?如果我對這個主題感興趣,請讓我來。 – ozw1z5rd

+0

@ ozw1z5rd我能看到的唯一區別就是起始索引。 'Rank'返回從1開始的索引。其餘部分都是一樣的。 – Ambrish

+0

完美!我錯過了它,它沒有交叉產品。 – ozw1z5rd

0

瞧」

+-----+------+ 
| id | _c1 | 
+-----+------+ 
| 1 | 4 | 
| 2 | 0 | 
| 3 | 8 | 
| 4 | 9 | 
| 5 | 7 | 
| 6 | 4 | 
| 7 | 6 | 
| 8 | 1 | 
| 9 | 2 | 
| 10 | 3 | 
+-----+------+ 

這很容易,自該查詢不交叉的產品它的瘋狂。當然,對於每一行,你必須找到所有具有較小值的行,看起來像交叉產品的東西是隱含的。

SELECT id, SUM(IF (c.res1 > c.res2, 1 , 0)) 
FROM ( 
    SELECT id, a.res AS res1, b.res AS res2 
    FROM test_4 AS a 
     INNER JOIN ( 
      SELECT res 
      FROM test_4 
     ) b 
) c 
GROUP BY id; 
0

你可以做以下,但要記得,因爲我們不檢查<從結果從排名刪除1 =但<(按順序的話,我們並不排斥計數當前行)

select 
id, 
res, 
rank() over (ORDER BY res) -1 as rank 
FROM point 

ORDER BY id 

或者很長的路要走:

由於Hive不支持CTE(它基於SQL-92標準),我們將不得不使用子查詢。

假設:我調用了包含ID和RES As POINT的表。

Select id, sum(comparison) as count 
From (

Select 
a.id, 
a.res as res1, 
b.res as res2, 
Case when a.res > b.res then 1 
Else 0 
End as comparison 

FROM point a 
CROSS JOIN point b 
) c 

GROUP BY id 

請測試並讓我知道。

0

排名可能是要走的路,但這裏是一個有趣的選擇:

SELECT  mt.id    AS id 
      , mt.res   AS res 
      , COUNT(1) OVER (PARTITION BY NULL ORDER BY mt.res ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1 AS cnt 
FROM  my_table mt