2017-05-31 443 views
0

我試圖構建一個只有下面的功能或這些功能的組合的配置單元查詢。例如,所述特徵包括具有某些特定排除條件的Hive查詢

名稱= 「摘要」

名稱= 「細節」

NAME1 = 「車輛統計」

NAME1 = 「加速度」

我不得不統計嚴格遵守上述條件的客戶數量。例如,在下表中,不應該計算顧客「歡樂」,因爲儘管他在名稱和「車輛狀態」和「加速度計」中都具有「摘要」和「細節」在name1中。

同樣,客戶「Lan」不應該被計算在內,因爲他在名稱1中另外做了「超速」,而不是在上述條件中。

customername name  name1 
    Joy    summary  vehicle stats 
    Joy    details  accelerometer 
    Joy    expenses speeding 
    Lan    summary  vehicle stats 
    Lan    details  accelerometer 
    Lan    details  speeding 
    Hana   details  accelerometer 
    Hana   summary  vehicle stats 

計數如下表必須是1,因爲只有1個客戶(花)誰曾做過名1只「摘要」,並命名爲「細節」和「汽車統計」和 「加速度」 。

這是我目前擁有的查詢:

select name, name1, count(distinct(customername)) 
    from table1 
    where date_time between "2017-01-01 00:00:00" and "2017-01-10 00:00:00" 
    group by name, name1 
    having name in ('summary', 'details') 
    or name1 in ('vehicle stats', 'accelerometer') 

任何建議將是偉大的!

+0

客戶是否需要全部4個屬性,或1個就足夠了? –

回答

0

部分1

select  customername 

from  table1 

group by customername 

having  count 
      (
       case 
        when name in ('summary', 'details') 
         or name1 in ('vehicle stats','accelerometer') 
        then 1 
       end 
      ) > 0 

     and count 
      (
       case 
        when name not in ('summary', 'details') 
         or name1 not in ('vehicle stats','accelerometer') 
        then 1 
       end 
      ) = 0 

+--------------+ 
| customername | 
+--------------+ 
| Hana   | 
+--------------+ 

第2部分

select  name 
      ,name1 
      ,count(*) 

from  (select  sort_array(collect_set(name)) as name 
         ,sort_array(collect_set(name1)) as name1 

      from  table1 

      group by customername 

      having  count 
         (
          case 
           when name in ('summary', 'details') 
            or name1 in ('vehicle stats','accelerometer') 
           then 1 
          end 
         ) > 0 

        and count 
         (
          case 
           when name not in ('summary', 'details') 
            or name1 not in ('vehicle stats','accelerometer') 
           then 1 
          end 
         ) = 0 
      ) t 

group by name 
      ,name1 

+-----------------------+-----------------------------------+----+ 
|   name   |    name1    | c2 | 
+-----------------------+-----------------------------------+----+ 
| ["details","summary"] | ["accelerometer","vehicle stats"] | 1 | 
+-----------------------+-----------------------------------+----+ 
+0

查看更新過的信息 –

+0

檢查第二部分... –

0

您也可以使用collect_set僅檢查這些列中的指定條目。

select customername 
from table1 
where date_time between "2017-01-01 00:00:00" and "2017-01-10 00:00:00" 
group by customername 
having concat_ws(',',collect_set(name)) = 'summary,details' 
and concat_ws(',',collect_set(name1)) = 'vehicle stats,accelerometer' 

有排序比較從collect_set 串聯輸出。

+0

這就要求客戶擁有全部4個屬性。另外,'collect_set'不保證訂單集。 –

+0

是@DuduMarkovitz ..我提到他必須對collect_set輸出進行排序才能進行比較。我認爲這個問題要求所有* 4屬性存在。 –

+0

評論說「你可能不得不」,因此,你的反應 - 你必須排序'collect_set'結果。代碼應該是固定的。 –

相關問題