-1
votes

SQL Subquiery avec une valeur agrégée

Désolé pour le titre vague, je suis un peu perdu ici. J'ai deux requêtes SQL agrégat simples, mais j'ai du mal à les combiner de manière fonctionnelle (probablement à travers une sous-requête) dans IBM DB2. L'objectif principal est d'exécuter la fonction de comptage dans la table des factures - mais avec la date de départ basée sur un résultat global de sous-requier maximum. xxx

mais comme indiqué, je ne veux pas être réparé. (20200101). J'aurais besoin d'exécuter une fonction max dans la table de service et d'utiliser son résultat comme paramenteur pour A.Invdate. Y a-t-il une façon raisonnable de faire cela? xxx

Donc, cherche à compter les factures pour chaque élément depuis la dernière date de service (correspondant à ses propres paramètres). Évidemment, a.item = b.Item ici.


0 commentaires

3 Réponses :


0
votes

Je pense que vous voulez Row_Number () CODE>:

select s.*
from (select s.*, row_number() over (partition by item order by servdate desc) as seqnum
      from service s
      where s.servtype = 1
     ) s
where seqnum = 1;


0 commentaires

2
votes

Si je vous ai suivi correctement, vous pouvez rejoindre ou utiliser une sous-requête corrélée: xxx

Ceci devrait être une approche efficace, à condition que vous ayez un index. sur services (élément, servype) .

Alternativement, voici l'approche rejoindre : xxx < / p>


6 commentaires

Je pense que vous avez besoin d'un groupe dans la sous-requête aussi


@HOGAN: Pas besoin de groupe par , il s'agit d'une sous-requête scalaire de toute façon.


oh je veux dire que vous voulez utiliser une jointure puis groupe pour obtenir un résultat plus rapide


@HOGAN: D'après mon expérience, une sous-requête corrélée avec le bon indice est souvent l'approche la plus rapide. Néanmoins, j'ai mis à jour ma réponse avec une solution qui utilise un rejoindre .


Les choses étranges sont arrivées


Désolé pour le retard de ma part. La première option a fonctionné bien, merci! Le seul problème que j'ai est si max (s.servdate) ne fournit aucune valeur pour ce s.item - alors cela ne montrera pas ce i.item du tout dans le résultat de la requête. Je préférerais compter (i.invno) pour montrer la valeur 0 alors. Je peux résoudre cela une solution de contournement, mais idéalement, cela fonctionnerait dans la même requête. Pourrait être utilisé pour cela?



0
votes

Puisque personne d'autre ne montre ce que je pense être le meilleur moyen que je posterai ...

select count(i.invno), i.item 
from invoices i
join (
    select max(s.servdate) maxd, s.item
    from services s 
    where s.servtype = 1
    group by s.item
) as sub on sub.item = i.item and a.invdate > sub.maxd
group by i.item


0 commentaires