2010-04-06 27 views
1

J'ai essayé de simplifier pour poser cette question. J'espère que cela sera compréhensible. Fondamentalement, j'ai une table de faits avec une dimension de temps, une autre dimension, et une dimension hiérarchique. Pour les besoins de la question, supposons que la dimension hiérarchique soit le code postal et l'état. L'autre dimension est juste descriptive. Appelons-le «client» Supposons qu'il y a 50 clients.sélectionnez toutes les valeurs d'une dimension pour laquelle il existe des faits dans toutes les autres dimensions

Je dois trouver l'ensemble des états pour lesquels il y a au moins un code postal dans lequel TOUS les clients ont au moins une ligne de faits pour chaque jour dans la dimension temporelle. Si un code postal n'a que 49 clients, je m'en fous. Si même un des 50 clients n'a pas de valeur même pour 1 jour dans un code postal, je m'en fous. Enfin, j'ai aussi besoin de savoir quels codes postaux qualifient l'état pour la sélection. Notez qu'il n'est pas obligatoire que chaque code postal ait un ensemble de données complet - seulement au moins un code postal.

Cela ne me dérange pas de faire plusieurs requêtes et de faire un peu de traitement côté client. C'est un ensemble de données qui doit seulement être généré une fois par jour et peut être mis en cache. Je ne vois même pas une manière particulièrement propre de le faire avec des requêtes multiples à court d'itération de force brute, et il y a beaucoup de 'codes postaux' dans l'ensemble de données (pas réellement les codes postaux, mais le sont environ 100.000 entrées dans le niveau inférieur de la hiérarchie et plusieurs centaines au plus haut niveau, si zipcode-> Etat est une analogie raisonnable)

+0

quelle base de données est-ce? – Unreason

+0

postgresql 8.3.x – ideasculptor

Répondre

1

en tant que première itération, vous pouvez essayer ce qui suit:

en supposant

  • clients (liste de tous clients)
  • zip_codes (liste de tous les codes postaux s)
  • jours (liste de tous les jours)
  • faits (tableau fait)

Je crois que vous devez décomposer

1) obtenir des clients et des codes postaux qui ont faits pour chaque jour

SELECT zip_id, customer_id, COUNT(DISTINCT days) 
FROM facts 
GROUP BY zip_id, customer_id 
HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 

2) de ce résultat pour zips ensemble vérification qui ont tous les clients

SELECT zip_id, COUNT(DISTINCT customer_id) 
FROM ( 
    SELECT zip_id, customer_id, COUNT(DISTINCT days) 
    FROM facts 
    GROUP BY zip_id, customer_id 
    HAVING COUNT(DISTINCT days) = (SELECT COUNT(*) FROM days) 
    ) S 
GROUP BY zip_id 
HAVING COUNT(DISTINCT customer_id) = (SELECT COUNT(*) FROM customers) 

après avoir obtenu des codes postaux, il devrait être facile de le rejoindre aux états.

+0

merci. Je ne sais pas pourquoi j'avais tellement de difficulté à envelopper ma tête. – ideasculptor