3 Stimmen

SQL-Anweisung(en)

Wenn ich die folgende Tabelle habe:

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;

Und ich möchte eine Tabelle erhalten, die die drei Fragen in ihrer neuesten Version anzeigt? Dies ist in SQL Server 2005

3voto

Cade Roux Punkte 85601
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;

1voto

Bill Karwin Punkte 493880
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;

1voto

Eric Punkte 87889

Sie verwenden SQL Server 2005, es lohnt sich also, zumindest die over Klausel:

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

1voto

Shannon Severance Punkte 17213

Ich würde gerne eine Tabelle erstellen, in der die drei letzten Versionen jeder Frage angezeigt werden .

  1. I annehmen dass diese qversion mit der Zeit zunimmt. Wenn diese Annahme rückwärts gerichtet ist, entfernen Sie die desc Schlüsselwort aus der Antwort.
  2. Die Tabellendefinition hat keine explizite Nicht-Null-Beschränkung für qversion. I annehmen dass eine Null-Q-Version ausgeschlossen werden sollte. (Hinweis: Abhängig von den Einstellungen kann das Fehlen einer expliziten null/nicht null Angabe in der Deklaration zu einer nicht null Einschränkung führen). Wenn die Tabelle eine nicht-Null-Beschränkung hat, dann wird der Text where qversion is not null sollten entfernt werden. Wenn qversion Null sein kann und Nullen in der Ergebnismenge enthalten sein müssen, sind zusätzliche Änderungen erforderlich.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X