1

ich die #standardsql in BigQuery bin mit und versuchen, die maksimum Ranking jedes customer_id als 1, und der Rest davon zu kodieren sind 0Decode maximale Anzahl in Reihen für SQL

Dies ist das Ergebnis der Abfrage so weit

rankings customer_id

Die Abfrage für das Ranking ist diese

ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY booking_date Asc) as ranking 

Was ich ne ed ist eine weitere Spalte so zu schaffen, in denen sie die maximale Ranking jedes customerid als 1, und die Zahl darunter als 0 ebenso wie die Tabelle unten Ihre Wir können

enter image description here

Dank

Antwort

1

Basierend auf Ihren Beispieldaten, um Ihr Ranking ist instabil, weil Sie mehrere Zeilen mit den gleichen Schlüsselwerten. Auf jeden Fall können Sie noch tun, was Sie ohne Unterabfragen wollen, nur case mit:

select t.*, 
     row_number() over (partition by customer_id order by booking_date asc) as ranking, 
     (case when row_number() over (partition by customer_id order by booking_date asc) = 
        count(*) over (partition by customer_id) 
      then 1 else 0 
     end) as custom_coded 
from t; 

Eine traditionelle Art und Weise im wesentlichen die gleiche Sache zu tun wäre, eine absteigende Sortierung zu verwenden:

select t.*, 
     row_number() over (partition by customer_id order by booking_date asc) as ranking, 
     (case when row_number() over (partition by customer_id order by booking_date desc) = 1 
      then 1 else 0 
     end) as custom_coded 
from t; 
+0

habe das obige versucht, und beide funktioniert, danke! – user3292755

1

dekodieren wickeln aktuelle Abfrage, und verwenden Sie dann MAX als eine analytische Funktion mit einer Partition von Kunden, um jeden ranking Wert mit dem maximalen ranking für jeden Kunden zu vergleichen. Wenn der ranking Wert den Maximalwert für einen Kunden entspricht, dann ordnen wir 1 für die custom_coded, sonst weisen wir 0.

SELECT 
    customer_id, item_bought, booking_date, ranking, 
    CASE WHEN ranking = MAX(ranking) OVER (PARTITION BY customer_id) 
     THEN 1 ELSE 0 END AS custom_coded 
FROM 
(
    SELECT customer_id, item_bought, booking_date, 
     ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY booking_date) ranking 
    FROM yourTable 
) t; 
+0

thx für die Eingänge @ tim-biegelsen – user3292755

Verwandte Themen