web-dev-qa-db-fra.com

Boolean comme mesure de la table ou de la valeur de la dimension / attribut

Ma table de fait consiste en des plaintes avec des dimensions typiques de l'OMS, de quoi et quand. Nous avons une cible que la plainte doit être répondu à une certaine période.

Je ne suis pas sûr de savoir comment il est préférable de modéliser si la plainte avait une réponse dans ce délai.

Je peux stocker à la fois la valeur cible et le résultat dans la table des faits en tant qu'étailleur avec le résultat en tant que mesure. Ou je pourrais utiliser une dimension qui a des valeurs de oui/non au lieu de représenter cela comme une mesure, je pourrais alors utiliser une mesure calculée dans mon cube. Ou je pourrais utiliser une combinaison des deux.

Existe-t-il des avantages, des inconvénients et des gotchas modélisant les faits dans la manière décrite ci-dessus?

Je prévois que cette table de fait sera utilisée pour obtenir le nombre total de plaintes, le nombre de plaintes a répondu à temps, le pourcentage a répondu à temps et identifiera également les plaintes individuelles qui n'ont pas été répondues à temps.

4
mheptinstall

Voici un moyen flexible de la stocker qui devrait soutenir les modifications des exigences à l'avenir.

  • Stockez la cible dans une dimension comme Dim_Complaint_type. De cette façon si, à l'avenir, vous avez des différents types de plaintes - par ex. Facturation, technique, ... - chacune d'entre elles peut être classée et avoir des cibles différentes. En appliquant lentement les dimensions de type 2 de type 2 sur l'attribut cible, vous pouvez également modifier votre cible d'une année à l'autre sans modifier le résultat des plaintes précédentes. Vous pouvez également faire une analyse "What-If" en modifiant la cible dans une dimension et de voir combien de plus/moins sont maintenant à temps.
  • Stockez le temps de réponse dans la table des faits, en tant que The Elapsed_Time (entier) ou en enregistrement_date et clôturing_date comme suggéré dans les commentaires. Ma préférence va pour l'enregistrement_date et la fermeture_date avec une colonne calculée elapsed_time qui est registration_date - closing_date.

Pour le résultat, je ne le stockerais pas comme un drapeau (oui/non) mais comme un numéro. Si vous appelez la colonne on_time et mettre un 1 pour chaque plainte qui répond à la cible, vous pouvez facilement résumer sur cette colonne pour avoir le total des plaintes sur une période sur une période.

Je vois trois façons d'obtenir le résultat:

  • Ne pas le stocker, mais la calculer à la volée dans votre déclaration en ayant la même formule partout pour vérifier si fact_complaint.elapsed_time est inférieur ou égal à dim_complaint_type.target ou pas. Cela pourrait être dangereux si différentes personnes utilisent différentes formules. Si vous avez un outil avec une couche de métadonnées (E.G. obiee, SAP BO, ...), vous pouvez définir cette mesure de résultat une fois pour tous.
  • Créez une vue qui rejoint faits_complaint et dim_complaint_type et ajoutez cette mesure de résultat dans la liste Select. Il serait défini une fois pour tous. Mais vous devez faire attention à cette approche car certains outils de rapport pourraient ne pas agir de la même manière avec une table ou une vue. L'optimiseur de la base de données pourrait également ne pas être capable de faire toute sa magie de la même manière.
  • En fait, rangez-la dans votre table de fait (c'est-à-dire la calculer à l'ETL TIME). C'est probablement la meilleure approche en termes de performance. Mais il faut mettre à jour cette colonne si vous modifiez la cible de certaines plaintes antérieures.
4
JeromeFr