-1
votes

Obtenir des comptes de données de ligne

Il y a une variable de table (je vais l'écrire comme une table régulière ici) xxx pré>

Ce tableau a des centaines de milliers de lignes, mais pour cet exemple, j'ai ajouté beaucoup moins P>

Member     Book      Clothes      Both
  1          0          0           1
  2          1          0           0
  3          1          0           0
  4          0          1           0
  5          0          0           1
  6          1          0           0 
  7          1          0           0
  • Les Membres qui ont "livre" seulement li>
  • Les Membres qui ont des "vêtements" seulement li>
  • Les Membres qui ont les deux «livres» et «vêtements» li> ul>

    par exemple p> xxx pré>

    J'avais réussi à le faire fonctionner avec des sous-demandes, mais en raison de la taille de la table, cela pourrait prendre plus de 2 minutes. courir. P>

    J'apprécierais que quelqu'un sait un meilleur moyen de y parvenir? p> p>


2 commentaires

Alors qu'avez-vous essayé, pourquoi cela n'a-t-il pas fonctionné? Vous demandez «Qu'est-ce qui est une meilleure façon», mais une meilleure façon que ce que ? Si vous avez utilisé des sous-coutumes, montrez-nous ces sous-requêtes. Vous n'avez rien montré que nos tentatives peuvent être «meilleures» que.


En règle générale, l'optimisation du lieu de démarrage est le plan exécution . S'il vous plaît voir Collez le plan pour un moyen d'inclure un plan d'exécution dans votre question.


3 Réponses :


3
votes

Une méthode utilise une agrégation conditionnelle: xxx

Ceci fonctionne car il n'y a que deux produit s. Si vous en avez réellement plus, alors vous avez besoin d'expressions plus compliquées (et éventuellement plus efficaces), telles que: xxx


6 commentaires

@Ragnar: Exécutez-vous la toute dernière version de la requête? J'ai édité ma réponse il y a quelques minutes.


Cela a fière allure, il ne s'agira que de 2 variantes et des deux. Donc cela pourrait être génial. Je vais essayer demain sur le jeu de données complet et vous le faire savoir. Mais merci pour toute votre aide! J'apprécie beaucoup.


@Ragnar. . . C'est une meilleure solution que les alternatives. Aucun CTE ou sous-requête n'est nécessaire et compteur (distinct) est généralement plus coûteux que les autres fonctions d'agrégation.


Merci @gordonlinoff, je vois ton point. Je vais marquer cela comme la réponse à quelqu'un d'autre qui a le même problème.


Si vous n'avez que deux valeurs possibles, la logique peut être simplifiée pour: Case lorsque Max (ProductType) = 'Book' puis 1 else 0 Entrée de livre, Case quand Min (ProductType) = 'Vêtements' puis 1 Vêtements d'autre 0 ,


@Dnoeth: ah oui, vous êtes correct, c'est plus court une requête (bien qu'aucun bénéfice de performance depuis les deux min () et max () doit être calculé pour chaque groupe) . J'ai changé la requête en conséquence, merci.



2
votes

Une variable de table avec des centaines de milliers de lignes va être problématique pour vous.

Si vous vérifiez votre plan de requête, vous verrez probablement que l'optimiseur s'attend à ce que la variable de table ne contienne qu'une ligne.

Modification de la structure en une table Temp locale et peut-être ajouter un index à productType doit améliorer considérablement les performances de la requête avant même d'optimiser votre code. xxx


0 commentaires

3
votes

Utilisez un CTE pour obtenir si chaque membre a book ou / ou vêtements code>: xxx pré>

Voir le Démo .
Résultats: P>

> memberid | book | clothes | both
> -------: | ---: | ------: | ---:
>        1 |    0 |       0 |    1
>        2 |    1 |       0 |    0
>        3 |    1 |       0 |    0
>        4 |    0 |       1 |    0
>        5 |    0 |       0 |    1
>        6 |    1 |       0 |    0
>        7 |    1 |       0 |    0


4 commentaires

C'est bien merci, je n'avais pas entendu parler de CTE auparavant. Il est temps de brosser mes compétences SQL :)


@Ragnar Voici un lien où vous pouvez trouver plus: docs.microsoft.com/en-us/sql/t-sql/queries/...


max (cas lorsque ProducteurType = 'book' puis 1 autre 0 extrémité) doit être plus efficace que compter distinct .


@Dnoeth sûr. S'il y a vraiment des centaines de milliers de lignes dans la table, il s'agit d'une option qui mérite d'être essayée.