sql >> Database teknologi >  >> RDS >> Database

Sådan nummereres rækker i SQL

Problem:

Du vil gerne give hver række i resultattabellen et separat nummer.

Eksempel:

Vores database har en tabel med navnet furniture med data i følgende kolonner:code (primær nøgle) og name .

kode navn
101 seng
202 sofa
333 stol
123 reol
235 tabel
766 skrivebord

furniture tabel gemmer navnet på møbler, som vi ønsker at nummerere.

Løsning:

SELECT ROW_NUMBER() OVER() AS num_row,
  code, 
  name
FROM furniture;

Forespørgslen returnerer rækkenummeret for hvert møbel sammen med dets navn og kode:

num_row navn kode
1 seng 101
2 sofa 202
3 stol 333
4 reol 123
5 tabel 235
6 skrivebord 766

Bemærk, at navnene på møblerne ikke er sorteret.

Diskussion:

Hvis du gerne vil nummerere hver række i et resultatsæt, giver SQL ROW_NUMBER() fungere. Denne funktion bruges i en SELECT klausul med andre kolonner. Efter ROW_NUMBER() klausul kalder vi OVER() fungere. Hvis du sender nogle argumenter til OVER , vil nummereringen af ​​rækker ikke blive sorteret efter nogen kolonne. Således vil rækkefølgen af ​​de viste rækker være ikke-deterministisk; i de fleste tilfælde er det den rækkefølge, posterne blev indsat i tabellen. Nummereringen af ​​rækker starter ved 1. I vores eksempel har hver post et tal fra 1 til 6.

Vi kan også tildele rækkenumre ved hjælp af en kolonne. I eksemplet nedenfor nummererer vi poster sorteret efter navn. Det gør vi ved at sende argumentet til OVER sammen med ORDER BY (det sorterer poster efter navnekolonnen):

SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture;

Når du ser på resultatsættet, ser du de sorterede rækker med deres numre:

række navn kode
1 seng 101
2 reol 123
3 stol 333
4 skrivebord 766
5 sofa 202
6 tabel 235

Nummereringen leveret af ROW_NUMBER() er uafhængig af rækkefølgen af ​​rækker i resultattabellen. I eksemplet nedenfor nummererer vi poster ved hjælp af det sorterede kolonnenavn (OVER(ORDER BY name) ), men vi viser poster i resultatsættet i henhold til en anden kolonne (i vores eksempel, ORDER BY code ).

SELECT ROW_NUMBER() OVER(ORDER BY name) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code;

Forespørgslen returnerede nummeret for hver række, men disse tal er ikke i stigende rækkefølge, fordi poster er sorteret efter kolonnekode:

række navn kode
1 seng 101
2 reol 123
5 sofa 202
6 tabel 235
3 stol 333
4 skrivebord 766

Standardrækkefølgen af ​​de sorterede rækker er stigende, men du kan også sortere i faldende rækkefølge ved hjælp af DESC søgeord efter navnet på den kolonne, som du vil sortere efter:

SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS num_row,
  name, 
  code
FROM furniture
ORDER BY code DESC;

Forespørgslen ovenfor returnerede resultatsættet:

række navn kode
4 skrivebord 766
3 stol 333
6 tabel 235
5 sofa 202
2 reol 123
1 seng 101

  1. SQL Server 2016:Opret en tabel fra et SQL-script

  2. Care To Know-klausuler:Alt om SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY og LIMIT

  3. ORA-00907:manglende højre parentes

  4. Hvorfor er IS NOT NULL falsk, når du tjekker en rækketype?