2017-03-14 3 views
0

Récemment, nous sommes passés de MySQL à Vertica. Je suis perdu sur la façon de recréer la vérification < = 30 dans la clause where de la requête ci-dessous. Cela ne fonctionne pas actuellement dans Vertica, mais dans MySQL. Essentiellement, un utilisateur possède des voitures et des voitures ont des pièces. Je veux totaliser le nombre de voitures et de pièces automobiles dans un délai donné, mais seulement pour les utilisateurs qui ont moins de 30 voitures.Basculer vers Vertica à partir de MySql, agréger dans la clause where ne fonctionne pas

select 
    count(distinct cr.id) as 'Cars', 
    count(distinct cp.id) as 'Car Parts' 
from 
    users u 
inner join 
    user_emails ue on u.id = ue.user_id 
inner join 
    cars cr on cr.user_id = u.id 
inner join 
    car_parts cp on cp.car_id = cr.id 
where 
    (
     select count(*) from cars where cars.user_id=u.id 
    ) <=30 
and 
    ue.is_real = true and ue.is_main = true 
and 
    cr.created_at >= '2017-01-01 00:00:00' and cr.created_at <= '2017-02-17 23:59:59' 

Toute aide ou conseil est grandement appréciée!

Avant ma souris s'envole et mes moniteurs se vide, je reçois cette erreur:

ERROR: Correlated subquery with aggregate function COUNT is not supported

+0

Cela ne fonctionne pas dans Vertica? –

+0

En quoi cela ne fonctionne-t-il pas? La souris s'envole? le moniteur s'éteint? Vous donne l'indigestion? –

+0

Ha ha. Excuses sur le manque d'info - J'obtiens l'erreur suivante: "ERREUR: Sous-requête corrélée avec la fonction d'agrégation COUNT n'est pas supportée" – Grip55

Répondre

0

Vous utiliseriez une sous-requête de cette façon. Vous utilisez une fonction de fenêtre:

select count(distinct cr.id) as Cars, 
     count(distinct cp.id) as CarParts 
from users u join 
    user_emails ue 
    on u.id = ue.user_id join 
    (select cr.*, count(*) over (partition by user_id) as cnt 
     from cars cr 
    ) cr 
    on cr.user_id = u.id join 
    car_parts cp 
    on cp.car_id = cr.id 
where cr.cnt <= 30 and 
     ue.is_real = true and ue.is_main = true 
     cr.created_at >= '2017-01-01' and 
     cr.created_at < '2017-02-18'; 

Notes:

  • Ne pas les alias de colonne dans des guillemets simples. C'est un bug qui attend de se produire. N'utilisez que des guillemets simples pour les constantes de chaîne et de date.
  • Vous pouvez simplifier la logique de la date. Utiliser < est mieux que <= pour capturer tout ce qui se passe un jour particulier.
+0

Cela fonctionne très bien! Je vois que la partition a fait l'affaire ... J'ai besoin d'en lire plus à ce sujet pour bien comprendre. Cela m'a mis sur le bon chemin - je l'apprécie vraiment! Et vos conseils sont dûment notés – Grip55