2014-10-09 8 views
6

Jestem małym nowicjuszem w BigQuery Google i próbuję uzyskać wynik przestawny z publicznego zestawu danych przykładowych.Jak przestawiać tabelę w Big Query

proste zapytanie do istniejącej tabeli jest

SELECT * 
FROM publicdata:samples.shakespeare 
LIMIT 10; 

Ta kwerenda zwraca następujący zestaw wynik.

enter image description here

Teraz co próbuję zrobić, to uzyskać wyniki z tabeli w taki sposób, że jeśli słowo jest odważny, wybierz „BRAVE” jako column_1 i jeśli słowo jest obecna, wybierz „uczestniczyło "jako kolumna_2 i zsumuj liczbę słów dla tych 2.

Oto zapytanie, którego używam.

SELECT 
(CASE WHEN word = 'brave' THEN 'BRAVE' ELSE '' END) AS column_1, 
(CASE WHEN word = 'attended' THEN 'ATTENDED' ELSE '' END) AS column_2, 
SUM (word_count) 
FROM publicdata:samples.shakespeare 
WHERE (word = 'brave' OR word = 'attended') 
GROUP BY column_1, column_2 
LIMIT 10; 

Ale ta kwerenda zwraca dane

enter image description here

czego szukałem na to

enter image description here

Znam ten pivot dla tego zestawu danych nie ma sensu . Ale właśnie biorę to jako przykład do wyjaśnienia problemu. Będzie wspaniale, jeśli będziesz mógł wskazać mi drogę.

EDYTOWANA: Odniosłem się także do How to simulate a pivot table with BigQuery? i wydaje się, że ma również ten sam problem, o którym wspomniałem.

Odpowiedz

6

Nie jestem pewien, co staramy się robić, ale:

SELECT NTH(1, words) WITHIN RECORD column_1, NTH(2, words) WITHIN RECORD column_2, f0_ 
FROM (
    SELECT NEST(word) words, SUM(c) 
    FROM (
    SELECT word, SUM(word_count) c 
    FROM publicdata:samples.shakespeare 
    WHERE word in ('brave', 'attended') 
    GROUP BY 1 
) 
) 

enter image description here

UPDATE: same wyniki, prostszy zapytanie:

SELECT NTH(1, word) column_1, NTH(2, word) column_2, SUM(c) 
FROM (
    SELECT word, SUM(word_count) c 
    FROM publicdata:samples.shakespeare 
    WHERE word in ('brave', 'attended') 
    GROUP BY 1 
) 
+0

'WYBIERZ słowo [SAFE_ORDINAL (1)] column_1, słowo [SAFE_ORDINAL (2)] column_2, SUM (c) ' w standardzie sql –

1

Spróbuj

SELECT sum(CASE WHEN word = 'brave' THEN word_count ELSE 0 END) AS brave , sum(CASE WHEN word = 'attended' THEN word_count ELSE 0 END) AS attended, SUM (word_count) as total_word_count FROM publicdata:samples.shakespeare WHERE (word = 'brave' OR word = 'attended') 
+0

Dałoby to wynik ustawiony jako 152 w kolumnie "odważny". Zauważ, że szukałem zestawu wyników, który ma "BRAVE" pod "column_1" i "ATTENDED" pod kolumną_2, a następnie agregatorem word_count, który jest 194. – user1401472

1

inspirowane także przez How to simulate a pivot table with BigQuery? następujący wniosek użyciu podselekcji daje dokładnie pożądany rezultat:

SELECT 
    MAX(column_1), 
    MAX(column_2), 
    SUM(wc), 
FROM (
    SELECT 
    (CASE WHEN word = 'brave' THEN 'BRAVE' ELSE '' END) AS column_1, 
    (CASE WHEN word = 'attended' THEN 'ATTENDED' ELSE '' END) AS column_2, 
    SUM (word_count) AS wc 
    FROM publicdata:samples.shakespeare 
    WHERE (word = 'brave' OR word = 'attended') 
    GROUP BY column_1, column_2 
    LIMIT 10 
) 

Sztuką jest to, że MAX(NULL, 'ATTENDED', NULL, ...) równa 'ATTENDED'.