1. 程式人生 > >hive:(group by, having;order by)的使用;group by+多個欄位,以及wiki說的group by兩種使用限制驗證

hive:(group by, having;order by)的使用;group by+多個欄位,以及wiki說的group by兩種使用限制驗證

hive> select * from app_data_stats_historical where os='1' group by dt limit 100;
出現結果如下:
2014-01-01
2014-01-06
......
2014-02-07
2014-02-10
2014-02-14
2014-02-17
2014-02-24
(只返回了一列日期。說明* 不起作用。不過這樣,可以檢視總共哪些日期,有效,存在資料)
加上having命令,having只作用於group by中的欄位,非group的欄位不行:
select * from app_data_stats_historical where os='1' group by dt having dt>' limit 1002014-02-01' limit 100;
2014-02-03
2014-02-04
2014-02-07
2014-02-10
2014-02-14
2014-02-17
2014-02-24
(可以用日期進行比較。)
 
hive> select * from app_data_stats_historical where os='1' order by dt desc limit 100;
欄位是全部返回的。降序。
 
group by 多個欄位:2周內分聯盟(5是多盟)分平臺(分平臺指的是分ios和android),分時段的曝光及點選。 select substr(createtime,12,2)hour,logtype,os_id,count(distinct logtype) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01'and adn=5 group by substr(createtime,12,2), logtype, os_id; 注意,時段hour提取函式substr和substring 是通用的!   或者分步做:將group的欄位按取值加到where中去(os_id取值1是android,2是iOS): select substr(createtime,12,2)hour,logtype,count(*) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01'and os_id='2' and adn=5 group by substr(createtime,12,2), logtype; 以及: select substr(createtime,12,2),logtype,count(*) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01'and os_id='1' and adn=5 group by substr(createtime,12,2), logtype;   substr(createtime,12,2)提取小時欄位,起hour別名,group by 不支援。 group 裡面不能起別名hour,直接用或引用都不行。 (1)Group by定義別名hour,報錯,解析錯誤 selectsubstr(createtime,12,2),logtype,count(*) from wizad_mdm_raw_hdfs where day >= '2014-12-01' group by substr(createtime,12,2) hour,logtype;   (2)引用定義的hour別名也不行: Line 4:9 Invalid table alias or column reference 'hour' select substr(createtime,12,2)hour,logtype,count(*) from wizad_mdm_raw_hdfs where day >= '2014-12-01' group by hour, logtype;       hive wiki上說group by有兩種使用情況限制 (1)group by只有一列,則distinct只能作用一列(可以多次作用同一列)  INSERT OVERWRITE TABLE pv_gender_sum  SELECT pv_users.gender, count (DISTINCT pv_users.userid)  FROM pv_users  GROUP BY pv_users.gender;    像這樣 SELECTpv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCTpv_users.userid)  只distinct一列,但出現多次是可以的。 下面的查詢錯誤,不允許DISTINCT多個列  INSERT OVERWRITE TABLE pv_gender_agg  SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCTpv_users.ip)  FROM pv_users  GROUP BY pv_users.gender; 但我測試發現是可以的。有大神可以給我解釋麼?   如 group by統計去重distinct個數 select substr(createtime,12,2)hour,logtype,os_id,count(distinct logtype), count(distinct os_id) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01'and adn=5 group by substr(createtime,12,2), logtype, os_id;     或者一些測試指令碼都說明了,我們
select logtype, count(distinct os_id),count(distinctip),count(distinct id) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01' group by logtype; 結果: 1      2       8493314 77579300 2      2       267685  211119   select substr(createtime,12,2) hour, count(distinctid),count(distinct ip) from wizad_mdm_raw_hdfs where ad_id in('19057','19058','812b4ba287f5ee0bc9d43bbf5bbe87fb') and day >= '2014-12-01'and adn=5 group by substr(createtime,12,2);                                                       部分結果如下: 00     1598136 154053 04     989745  51201 …… 18     1711493 201436 21     3644241 374243     (2)另一個wiki限制說明:group by後,除了作用列和聚合函式統計項,多餘列不能存在。 這個我驗證過確實是不行的。 SELECT a,sum(b) FROM t1 GROUP BY a; 是正確的   下面是錯誤的。 SELECT a,b FROM t1 GROUP BY a; 因為有多餘列b,其不在group by的欄位屬性,(且不是聚合函式). 查詢結果會是這樣 a   b ------ 100 1 100 2 100 3 gourp by a後,b不能成為集合{1,2,3}返回,你可以count,但不能直接返回b。b是多值的。hive摒棄了這種猜測無效的SQL(HQL,要準確):有一列在select子句中,卻不包含在GROUPBY子句中。 pig是可以構成集合返回的。    

相關推薦

hive(group by, having;order by)的使用group by+以及wiki說的group by使用限制驗證

hive> select * from app_data_stats_historical where os='1' group by dt limit 100; 出現結果如下: 2014-01-01 2014-01-06 ...... 2014-02-07 2014

linq/EF/lambda Group by/Order by 詳細用法

1)單個欄位Group by: //a.Key型別與a.Province欄位型別一樣 .GroupBy(a => a.Province).Select(a => a.Key).ToList(); 2)多個欄位Group by: //此時返回的資料列表需要

group by

首先group by 的簡單說明:    group by 一般和聚合函式一起使用才有意義,比如 count sum avg等,使用group by的兩個要素:    (1) 出現在select後面的欄位 要麼是是聚合函式中的,要麼就是group by 中的.    (2)

group by

首先group by 的簡單說明:    group by 一般和聚合函式一起使用才有意義,比如 count sum avg等,使用group by的兩個要素:    (1) 出現在select後面的欄位 要麼是是聚合函式中的,要麼就是group by 中的.    (2) 要篩選結果 可以先使用where

MYSQL GROUP BY進行分組

在平時的開發任務中我們經常會用到MYSQL的GROUP BY分組, 用來獲取資料表中以分組欄位為依據的統計資料。比如有一個學生選課表,表結構如下: Table: Subject_Selection Subject Semester Attendee -------

parttion by ~~~針對某個重複資料只取前n條。問題例子1.主評論下的評論按著 時間正序最隻取前5條 2.獲取最新登入記錄......

分組目前已知partition by、group by partition by用於給結果集分組分割槽,如果沒有指定那麼它把整個結果集作為一個分組,最後顯示具體資料 group by:通過所查詢的資料的某一欄位或屬性進行分組,最後顯示組資料,而不是具體資料,因為select 後面的所有列中,沒有使用聚合函

order by的排序

預設的排序方式是ASC升序 ORDER BY 多個欄位之間用英文逗號隔開,其實在很多場景下都是結合者GROUP BY使用。 舉一個例子 1、create_date用升序, up_votes降

mysql order by排序

MySql Order By 多個欄位 排序規則比如:如要根據ConfigID和MarketID來排序有如下語句:SELECT * FROM TABLE ORDER BY ConfigID, MarketID DESC;那麼結果:分析:其實這個語句等同於:先按照ConfigI

若sql語句中order by指定了,則怎麼排序?

舉個例子吧:order by id desc,time desc先是按 id 降序排列 (優先)如果 id 欄位 有些是一樣的話 再按time 降序排列 (前提是滿足id降序排列)  order by name, age desc  name優先name一樣的話 就按a

mysql group by進行分組

在平時的開發任務中我們經常會用到MYSQL的GROUP BY分組, 用來獲取資料表中以分組欄位為依據的統計資料。比如有一個學生選課表,表結構如下: Table: Subject_Selection Subject Semester Att

elasticsearch系列-ES對聚合select A,B,COUNT(*) from table group by A,B

ES對多個欄位聚合,select A,B,COUNT(*)from table group by A,B 假設有下表 NAME SEX PROF 李誠 男 副教授 張旭 男 講師 王萍 女 助教 劉冰

SQL查詢語句where,group by,having,order by的執行順序和編寫順序

當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序。 一、使用count(列名)當某列出現null值的時候,count(*)仍然會計算,但是count(列名)不會。 二、資料分組(group by ): sel

sql的having深入理解group by只返回一組的一行compute更好

Having where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,條件中不能包含聚組函式,使用where條件顯示特定的行。 having 子句的作用是篩選滿足條件的組,即在分組之後過濾資料,條件中經常包含聚組函式,使用hav

SQL語句where,Group By,having order by 的詳細使用方法

1. Group By 語句簡介: Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。 P.S. 這裡真是體會到了一個好的命名的力量,G

sql grop by having order by 的用法

GROUP BY 語句 group by 一般和聚合函式一起使用,根據一個或者多欄位對結果集進行分組統計。 使用示例:orders表為例 O_Id OrderDate OrderPrice Customer 1 2008/12/29 1000

SQL語句order by同時排序問題

可能對不少網友來說非常簡單,但是我覺得在一定程度上對我還是有些迷惑之處,下面就通過hibernate中的HQL語句來介紹下這類問題的效果。 首先HQL語句程式碼: FROM Topic t WHERE t.id >2 ORDER BY t.type DESC,t.number DESC

SQL語句order by同時排序

ORDER BY  後可加2個欄位,用英文逗號隔開。 f1用升序, f2降序,SQL該這樣寫 ORDER BY  f1, f2  DESC 也可以這樣寫,更清楚: ORDER BY  f1 AS

【SQL語句】Order by 同時排序

    小編最近在專案中用到了order by 字句排序,並且是根據兩個欄位排序,到網搜尋一翻,果然收穫不少。    order by 可同時排序2個欄位,欄位中間用英文逗號可開。 1、f1用升序

mysql SQL語句order by同時排序

ORDER BY  後可加2個欄位,用英文逗號隔開。 f1用升序, f2降序,sql該這樣寫 ORDER BY  f1, f2  DESC 也可以這樣寫,更清楚: ORDER BY  f1

MySql分組查詢(group by)並計算對應的之和及相乘之後的和

有表如下: 需求:求出每一種商品(goods_id)的數量(goods_num)之和及單價(goods_price)乘以數量之和 sql 語句:SELECT sum(goods_pirce*goods_num) AS price_amount,sum(goods_num)