2010-02-08 3 views
1

Supposons que j'ai une table appelée spitems avec les champs suivants:requête difficile (DB2)

  • spitemid (clé unique)
  • de ModifiedOn (timestamp)
  • parentid
  • un certain nombre d'autres non significatif Les champs

Ce que je veux récupérer, ce sont les lignes spitem avec le jour le plus élevé modifié pour chaque parentid. Cependant, sachez que l'horodatage modifiedon n'est pas unique, donc il est possible que pour un id parent, il y ait deux spitemids avec le même timestamp modifié. Dans ce cas, j'ai besoin d'un de ces deux spitemids listés, peu importe lequel. Donc, pour être clair: la liste que je retourne devrait contenir toutes les parentides une seule fois et une seule fois.

+0

si elle était serveur sql, ce serait un dup de cette question (et d'autres) http://stackoverflow.com/questions/2215129/can-this-sql-statement-be-refactored-to- non-use-rank-partition/2215159 # 2215159 – Hogan

+0

... mais ce n'est pas le cas. – Fortega

+0

Juste pour être clair, quand vous dites "avec le plus élevé modifiedon * day *", vous voulez dire * date * right? – JosephStyons

Répondre

2

mise à jour

réunion sur, voici mon coup:

select * 
from table 
join where spitmid in 
    (select max(spitmid) 
    from table 
    join 
    (select parentid, max(modifiedon) as d from table group by parentid) inlist 
     on table.parentid = inlist.parentid and table.modifiedon = inlist.d 
    group by parentid, datemodified 
) 

ancienne entrée

ne sais pas si cela est différent sur DB2, ici il est pour serveur SQL.

select * 
    from table 
    join (select parentid, max(modifiedon) as d from table group by parentid) as toplist on 
     table.parentid = toplist.parentid and table.modifiedon = toplist.d 

hmm ... ce sera de retour plus d'un pour les dups ... ne peut pas fixer maintenant, doivent aller à une réunion.

+0

cela renvoie deux lignes pour les parentids pour lesquels la date modifiedon est égale – Fortega

+1

La réponse de Sam résout le problème dup ... une autre sous-requête est la façon de procéder (dans le serveur sql vous pouvez utiliser cross apply ...) – Hogan

+0

La réponse de Sam contient une erreur :) – Fortega

1

Selon vos besoins, les articles suivants devraient vous être fournis.

SELECT t1.* 
FROM  Table t1 
      INNER JOIN (
      SELECT spitemid = MAX(t1.spitemid) 
      FROM  Table t1 
         INNER JOIN (
         SELECT parentid, modifiedon = MAX(modifiedon) 
         FROM  Table 
         GROUP BY parentid 
        ) t2 ON t2.parentid = t1.parentid 
           AND t2.modifiedon = t1.modifiedon 
      GROUP BY t1.parentid, t1.modifiedon 
     ) t2 ON t2.spitemid = t1.spitemid 
+1

max (spitemid) est faux - il peut ne pas être le même enregistrement que le max (modifiedon) – Hogan

+0

+ Je voudrais récupérer tous les autres champs aussi – Fortega

+0

@Hogan, tout à fait raison. Correction de l'erreur, thx. –

0

Vous pouvez le faire avec deux sous-requêtes imbriquées. Le premier est modifié au maximum pour chaque parentid, et le second reçoit un maximum de spitemid pour chaque groupe parentid/modifiedon.

SELECT * 
FROM spitems 
WHERE spitemid IN 
(
    SELECT  parentid, modifiedon, max(spitemid) spitemid 
    FROM (
     SELECT  parentid, MAX(modifiedon) modifiedon 
     FROM  spitems 
     GROUP BY parentid 
    ) A 
    GROUP BY parentid, modifiedon 
) 
+0

Cela ne fonctionnera pas: vous sélectionnez le max (spitemid) d'une table avec seulement un parentid et un champ modifiedon. Exception: spitemid n'est pas valide dans le contexte où il est utilisé. – Fortega

+0

@Fortega, tu as raison, je voulais rejoindre à nouveau les 'spitems' pour récupérer' spitemid' basé sur 'modifiedon'. Oublié cependant. –

-3
SELECT sr.receiving_id, sc.collection_id FROM stock_collection as sc, stock_requisation as srq, stock_receiving as sr WHERE (sc.stock_id = '" & strStockID & "' AND sc.datemm_issued = '" & strMM & "' AND sc.qty_issued >= 0 AND sc.collection_id = srq.requisition_id AND srq.active_status = 'Active') OR (sr.stock_id = '" & strStockID & "' AND sr.datemm_received = '" & strMM & "' AND sr.qty_received >= 0) 
+0

vous êtes en effet un chat wow (je ne -1 noobs, mais vous êtes loin de la piste) – Hogan

+0

Merci d'être gentil Hogan :) – wowcat

+0

Cependant insta-moins un par un troll. Vous ne les voyez pas contribuer. – wowcat

0

Une expression de table commune vous donnera la possibilité de numéroter les lignes avant d'émettre la finale SELECT.

 
WITH items AS 
(
SELECT spitemid, parentid, modifiedon, 
ROWNUMBER() OVER (PARTITION BY parentid ORDER BY modifiedon DESC) AS rnum 
FROM yourTable 
) 
SELECT spitemid, parentid, modifiedon FROM items WHERE rnum = 1 
;