2009-08-05 6 views
0

J'ai quelques enregistrements dans ma table tbl1. Il y a une colonne s, basée sur laquelle j'ai besoin de récupérer les lignes où datateime1 est une ancienne date.SQL: sélection de plusieurs lignes par groupe

Si j'essaie la requête ci-dessous, il me semble que les résultats sont corrects. Maintenant, j'essaie d'obtenir le deux les plus anciennes lignes du groupe s1. J'ai essayé en ajoutant deux fois 's1' à la clause IN, mais cela ne fonctionne pas, car les lignes sont sélectionnées par leur ROWNUMBER.

Alors, comment puis-je réécrire la requête pour sélectionner un nombre flexible de lignes par groupe (en commençant par les deux dates les plus anciennes)?

Requête:

SELECT 
    tbl2.* 
FROM 
    (
    SELECT 
    a, b, c, 
    ROW_NUMBER() OVER (PARTITION BY tbl1.s ORDER BY tbl1.Datetime1)) AS RowNo 
    FROM 
    tbl1 
    WHERE 
    tbl1.s in ('s1','s2','s2','s3','s1','s4') 
) AS tbl2 
WHERE 
    tbl2.rowno = 1 

tbl1 ressemble:

a   b   c   s  Datetime1 
------------------------------------------------- 
samp1a  samp1b  samp1c  s1  1/1/2000 
samp1a  samp1b  samp1c  s1  2/1/2000 
samp1a  samp1b  samp1c  s1  3/1/2000 
samp2a  samp2b  samp2c  s2  2/1/2002 
samp2a  samp2b  samp2c  s2  3/1/2002 
samp3a  samp3b  samp3c  s3  3/1/2000 

La sortie désirée est:

a   b   c   s  p 
------------------------------------------------- 
samp1a  samp1b  samp1c  s1  1/1/2000 
samp1a  samp1b  samp1c  s1  2/1/2000 
samp2a  samp2b  samp2c  s2  2/1/2002 
samp3a  samp3b  samp3c  s3  3/1/2000 
+1

Mec, sérieusement. Si nous sommes supposés vous donner des conseils gratuits, pourriez-vous être plus clair, utiliser des paragraphes, éviter les phrases à répétition, et éviter les néologismes comme "bcz"? C'est trop comme du travail pour essayer de comprendre ce que vous voulez dire. – tpdi

+0

@vignesh: J'ai essayé de réécrire complètement votre question, pour autant que je puisse la comprendre. Veuillez passer en revue mes changements et vérifier si cela correspond toujours à votre intention. Vous pouvez apporter d'autres modifications en cliquant sur "modifier". – Tomalak

Répondre

1

Je devine que l'anglais est pas votre langue maternelle, mais comment environ:

where tbl2.rowno=1 OR (tbl2.rowno = 2 and tbl1.s = s1) 

... ou quoi que ce soit à dire "est s1"

Rob

+0

+1 Fondamentalement, c'est ce que l'OP demande, un beau travail pour comprendre le désordre de la version originale. – Tomalak