2009-09-29 6 views
3

Si je le tableau suivant:Déclaration SQL (s)

CREATE TABLE #temp (
    id int, 
    num int, 
    question varchar(50), 
    qversion int); 

INSERT INTO #temp VALUES(1, 1, 'Question 1 v1', 1); 
INSERT INTO #temp VALUES(2, 1, 'Question 1 v2', 2); 
INSERT INTO #temp VALUES(3, 2, 'Question 2 v1', 1); 
INSERT INTO #temp VALUES(4, 2, 'Question 2 v2', 2); 
INSERT INTO #temp VALUES(5, 2, 'Question 2 v3', 3); 
INSERT INTO #temp VALUES(6, 3, 'Question 3 v1', 1); 

SELECT * 
FROM #temp; 

DROP TABLE #temp; 

Je voudrais obtenir une table pour afficher les trois questions dans leur version la plus récente? Ceci est dans SQL Server 2005

+0

+1 pour la table créer et insérer des déclarations. Il semble cependant, si je comprends bien la question, que toutes les lignes dans les données de test données doivent être retournées. Je suggère d'inclure les lignes qui seraient exclues par la bonne requête. –

Répondre

3
CREATE TABLE #temp (
    id int, 
    num int, 
    question varchar(50), 
    qversion int); 

INSERT INTO #temp VALUES(1, 1, 'Question 1 v1', 1); 
INSERT INTO #temp VALUES(2, 1, 'Question 1 v2', 2); 
INSERT INTO #temp VALUES(3, 2, 'Question 2 v1', 1); 
INSERT INTO #temp VALUES(4, 2, 'Question 2 v2', 2); 
INSERT INTO #temp VALUES(5, 2, 'Question 2 v3', 3); 
INSERT INTO #temp VALUES(6, 3, 'Question 3 v1', 1); 

WITH latest AS (
    SELECT num, MAX(qversion) AS qversion 
    FROM #temp 
    GROUP BY num 
) 
SELECT #temp.* 
FROM #temp 
INNER JOIN latest 
    ON latest.num = #temp.num 
    AND latest.qversion = #temp.qversion; 

DROP TABLE #temp; 
+0

Ceci est, mais il y a un '' 'supplémentaire dans la sous-requête et le nombre doit être dans un groupe par. (ne peut pas éditer) – SBurris

+0

Ouais, je souhaite que vous puissiez exécuter des choses directement sur StackOverflow ... –

1
SELECT t1.id, t1.num, t1.question, t1.qversion 
FROM #temp t1 
LEFT OUTER JOIN #temp t2 
    ON (t1.num = t2.num AND t1.qversion < t2.qversion) 
GROUP BY t1.id, t1.num, t1.question, t1.qversion 
HAVING COUNT(*) < 3; 
1

Vous utilisez SQL Server 2005, il est donc une valeur d'au moins explorer la over clause:

select 
    * 
from 
    (select *, max(qversion) over (partition by num) as maxVersion from #temp) s 
where 
    s.qversion = s.maxVersion 
1

Je voudrais obtenir une table afficher les trois dernières versions de chaque question.

  1. Je suppose que ce qversion augmente avec le temps. Si cette hypothèse est à l'envers, supprimez le mot-clé desc de la réponse.
  2. La définition de table n'a pas de contrainte explicite non nulle sur qversion. I suppose qu'une version nulle doit être exclue. (Remarque: Selon les paramètres, l'absence d'une valeur null/not null explicite dans la déclaration peut entraîner une contrainte non nulle.) Si la table a une contrainte non nulle, le texte where qversion is not null doit être supprimé. Si qversion peut être nul et que les valeurs nulles doivent être incluses dans le jeu de résultats, des modifications supplémentaires devront être apportées.

CREATE TABLE #temp (
    id int, 
    num int, 
    question varchar(50), 
    qversion int); 

INSERT INTO #temp VALUES(1, 1, 'Question 1 v1', 1); 
INSERT INTO #temp VALUES(2, 1, 'Question 1 v2', 2); 
INSERT INTO #temp VALUES(3, 2, 'Question 2 v1', 1); 
INSERT INTO #temp VALUES(4, 2, 'Question 2 v2', 2); 
INSERT INTO #temp VALUES(5, 2, 'Question 2 v3', 3); 
INSERT INTO #temp VALUES(7, 2, 'Question 2 v4', 4); 
-- ^^ Added so at least one row would be excluded. 
INSERT INTO #temp VALUES(6, 3, 'Question 3 v1', 1); 
INSERT INTO #temp VALUES(8, 4, 'Question 4 v?', null); 

select id, num, question, qversion 
from (select *, 
     row_number() over (partition by num order by qversion desc) as RN 
    from #temp 
    where qversion is not null) T 
where RN <= 3 
Questions connexes