REDSHIFT : attribuez une valeur dans la colonne à toutes les lignes en fonction d'une certaine valeur dans une autre colonne

Michi

DB-Violon

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    order_date DATE,
    country VARCHAR(255),
    customer VARCHAR(255)
);

INSERT INTO customers
(order_date, country, customer)
VALUES 
('2020-04-10', 'DE', 'user_01'),
('2020-04-11', 'DE', 'user_01'),
('2020-04-13', 'AT', 'user_01'),

('2020-04-20', 'AT', 'user_02'),
('2020-04-22', 'AT', 'user_02'),

('2020-05-19', 'DE', 'user_03'),

('2020-06-17', 'AT', 'user_04'),
('2020-06-23', 'AT', 'user_04'),
('2020-07-04', 'DE', 'user_04'),

('2020-08-19', 'NL', 'user_05'),
('2020-10-23', 'FR', 'user_05');

Résultat attendu:

order_date   |   customer  |  first_country   |   second_country  | 
-------------|-------------|------------------|-------------------|-----------
2020-04-10   |   user_01   |       DE         |         DE        |
2020-04-11   |   user_01   |       DE         |         DE        |
2020-04-13   |   user_01   |       AT         |         DE        |
-------------|-------------|------------------|-------------------|-----------             
2020-04-20   |   user_02   |       AT         |        NULL       |
2020-04-22   |   user_02   |       AT         |        NULL       |
-------------|-------------|------------------|-------------------|-----------          
2020-05-19   |   user_03   |       DE         |        NULL       | 
-------------|-------------|------------------|-------------------|----------- 
2020-06-17   |   user_04   |       AT         |         DE        |
2020-06-23   |   user_04   |       AT         |         DE        |
2020-07-04   |   user_04   |       DE         |         DE        |
-------------|-------------|------------------|-------------------|----------- 
2020-08-19   |   user_05   |       NL         |        NULL       |
2020-10-23   |   user_05   |       FR         |        NULL       |

Dans l'exemple ci-dessus, il peut arriver qu'un client ait commandé à la fois en DEet en AT.
Pour ces clients, je souhaite attribuer le pays DEdans la colonne second_countryà chacun de leurs fichiers order_dates.

En référence à la réponse à cette question, j'ai essayé d'aller avec ceci:

SELECT
c.order_date AS order_date,
c.customer AS customer,
c.country AS first_country,

(CASE WHEN COUNT(*) FILTER (WHERE c.country = 'DE') OVER (PARTITION BY c.customer) > 0 AND
           COUNT(*) FILTER (WHERE c.country = 'AT') OVER (PARTITION BY c.customer) > 0
      THEN 'DE'
      END) AS second_country
        
FROM customers c

GROUP BY 1,2,3
ORDER BY 1,2,3;

Cependant, dans redshiftla FILTERfonction n'est pas disponible.
Comment dois-je modifier la requête pour qu'elle fonctionne également redshift?

Gordon Linoff

Utilisez simplement des caseexpressions :

SELECT c.order_date AS order_date,
       c.customer AS customer,
       c.country AS first_country,
       (CASE WHEN SUM(CASE WHEN c.country = 'DE' THEN 1 ELSE 0 END) OVER (PARTITION BY c.customer) > 0 AND
                  SUM(CASE WHEN c.country = 'AT' THEN 1 ELSE 0 END) OVER (PARTITION BY c.customer) > 0
             THEN 'DE'
         END) AS second_country        
FROM customers c
GROUP BY 1,2,3
ORDER BY 1,2,3;

En fait, vous pouvez simplifier cela en :

       (CASE WHEN SUM( (c.country = 'DE')::int ) OVER (PARTITION BY c.customer) > 0 AND
                  SUM( (c.country = 'DE')::int ) OVER (PARTITION BY c.customer) > 0
             THEN 'DE'
        END) AS second_country        

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  2. 2

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  3. 3

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  4. 4

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  5. 5

    Trouver l'intersection et l'union de deux rectangles

  6. 6

    Comment changer la couleur de la police dans R?

  7. 7

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  8. 8

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  9. 9

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  10. 10

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  11. 11

    Comment convertir une chaîne en tuple en utilisant `reads`?

  12. 12

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  13. 13

    comment afficher un bouton au-dessus d'un autre élément ?

  14. 14

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  15. 15

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  16. 16

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  19. 19

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  20. 20

    comment le contrôle de tableau javascript devrait-il être

  21. 21

    impossible d'ouvrir un nouvel onglet dans react, ajoute localhost: 3000 sur le lien?

chaudétiquette

Archive