it-swarm.com.de

So erhöhen Sie eine Auswahlabfrage

Ich habe eine Abfrage, an der ich gerade arbeite, und ich möchte eines der Felder inkrementieren und den Zähler neu starten, wenn ein Schlüsselwert unterschiedlich ist. 

Ich weiß, dass dieser Code nicht funktioniert. Programmatisch will ich das ...

declare @counter int, @id
set @counter = 0
set @id = 0

select distinct 
  id, 
  counter = when id = @id 
              then @counter += 1
            else @id = id  
               @counter = 1     

... und das Ergebnis sieht ungefähr so ​​aus:

ID    Counter
3     1
3     2 
3     3
3     4
6     1
6     2
6     3
7     1

Und ja, ich stecke mit SQL2k fest. Andernfalls würde row_number () funktionieren.

10
Mikecancook

Angenommen eine Tabelle:

CREATE TABLE [SomeTable] (
  [id] INTEGER,
  [order] INTEGER,
  PRIMARY KEY ([id], [order])
);

Eine Möglichkeit, dies in Microsoft SQL Server 2000 zu erhalten, besteht darin, eine Unterabfrage zu verwenden, um die Zeilen mit derselben ID und einer niedrigeren Reihenfolge zu zählen.

SELECT *, (SELECT COUNT(*) FROM [SomeTable] counter 
           WHERE t.id = counter.id AND t.order < counter.order) AS row_num
FROM [SomeTable] t

Tipp: Es ist 2010. Bald ist Ihr SQL Server alt genug, um fahren zu können. 

Wenn Sie SQL Server 2005 oder höher verwenden, erhalten Sie wunderbare neue Funktionen wie ROW_NUMBER() OVER (PARTITION...).

13
Bill Karwin

Ja, Sie möchten ROW_NUMBER ().

Ich würde versuchen: 

SELECT id, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS Counter
6
Eddie

Eine Möglichkeit, dies zu tun, besteht darin, die Daten in eine temporäre Tabelle mit einer Identitätsspalte zu werfen, die als Zeilennummer verwendet wird. Nehmen Sie dann die Zählerspalte zur Zählung der anderen Zeilen mit derselben ID und einer niedrigeren Zeilennummer + 1 vor.

CREATE TABLE #MyData(
Id INT
);

INSERT INTO #MyData VALUES(3);
INSERT INTO #MyData VALUES(3);
INSERT INTO #MyData VALUES(3);
INSERT INTO #MyData VALUES(3);
INSERT INTO #MyData VALUES(6);
INSERT INTO #MyData VALUES(6);
INSERT INTO #MyData VALUES(6);
INSERT INTO #MyData VALUES(7);

CREATE TABLE #MyTempTable(
RowNum INT IDENTITY(1,1),
Id INT,
Counter INT
);

INSERT INTO #MyTempTable
SELECT Id, 0
FROM #MyData
ORDER BY Id;

SELECT Id, (SELECT COUNT(*) + 1 FROM #MyTempTable WHERE Id = t1.Id AND RowNum < t1.RowNum) AS 'Counter'
FROM #MyTempTable t1;

Sie sollten die folgende Ausgabe basierend auf Ihrem Beispiel erhalten:

Id  Counter
3   1
3   2
3   3
3   4
6   1
6   2
6   3
7   1
3
Jamie

Mit row_number () müssen Sie weit weniger korrelierte Unterabfragen erledigen. @ Bill Karwins Lösung funktioniert (+1); Hier ist eine andere Version, die dasselbe tut, aber es könnte einfacher sein, ihr zu folgen. (Ich habe Datumsangaben verwendet, um die Reihenfolge zu bestimmen.)

--  Test table
CREATE TABLE Test
 ( Id      int       not null
  ,Loaded  datetime  not null
 )

--  Load dummy data with made-up distinct datetimes
INSERT Test values (3, 'Jan 1, 2010')
INSERT Test values (3, 'Jan 2, 2010')
INSERT Test values (3, 'Jan 5, 2010')
INSERT Test values (3, 'Jan 7, 2010')
INSERT Test values (6, 'Feb 1, 2010')
INSERT Test values (6, 'Feb 11, 2010')
INSERT Test values (7, 'Mar 31, 2010')


--  The query
SELECT t1.Id, count(*) Counter
 from Test t1
  inner join Test t2
   on t2.Id = t1.Id
    and t2.Loaded <= t1.Loaded
 group by t1.Id, t1.Loaded


--  Clean up when done
DROP TABLE Test

Es ist wichtig anzumerken, dass diese Art von Abfragen ohne gute Indizes (und vielleicht sogar mit ihnen) sehr schlecht funktionieren kann, insbesondere bei großen Tabellen. Prüfen und optimieren Sie sorgfältig!

0
Philip Kelley

Für MySql konnte ich es mit dieser Abfrage machen.

SELECT (SELECT COUNT(id) +1 FROM sku s WHERE t.item_id = s.item AND s.id < t.sku_id) AS rowNumber, t.*
FROM
(select item.Name as itemName ,item.id as item_id , sku.Name as skuName ,sku.id as sku_id from item
    INNER JOIN sku ON item.id = sku.item
    WHERE item.active = 'Y' 
) t


1   Roasted Pistachios (Salted, In Shell)   84  1 Pound Bags    84
3   Roasted Pistachios (Salted, In Shell)   84  25 Pound Cases  1174
5   Roasted Pistachios (Salted, In Shell)   84  12 x 2.6 Ounce Bags 5807
2   Roasted Pistachios (Salted, In Shell)   84  5 Pound Bags    814
4   Roasted Pistachios (Salted, In Shell)   84  Samples 4724
6   Roasted Pistachios (Salted, In Shell)   84  12 x 3.2 Ounce Bags 18145
4   Star Fruit  981 5 Pound Bags    17462
1   Star Fruit  981 1 Pound Bags    2125
3   Star Fruit  981 11 Pound Bags   2226
2   Star Fruit  981 44 Pound Cases  2156
0
Atish Narlawar