sql >> Database >  >> RDS >> Database

Rijen nummeren in SQL

Probleem:

U wilt elke rij in de resultatentabel een apart nummer geven.

Voorbeeld:

Onze database heeft een tabel met de naam furniture met gegevens in de volgende kolommen:code (primaire sleutel) en name .

code naam
101 bed
202 bank
333 stoel
123 boekenkast
235 tabel
766 bureau

De furniture table slaat de naam op van meubelstukken die we willen nummeren.

Oplossing:

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

De zoekopdracht retourneert het rijnummer van elk meubelstuk samen met de naam en code:

num_row naam code
1 bed 101
2 bank 202
3 stoel 333
4 boekenkast 123
5 tabel 235
6 bureau 766

Merk op dat de namen van de meubelstukken niet gesorteerd zijn.

Discussie:

Als u elke rij in een resultatenset wilt nummeren, biedt SQL de ROW_NUMBER() functie. Deze functie wordt gebruikt in een SELECT clausule met andere kolommen. Na de ROW_NUMBER() clausule noemen we de OVER() functie. Als u argumenten doorgeeft aan OVER , wordt de nummering van rijen niet gesorteerd op een kolom. De volgorde van de weergegeven rijen is dus niet-deterministisch; in de meeste gevallen is dit de volgorde waarin de records in de tabel zijn ingevoegd. De nummering van rijen begint bij 1. In ons voorbeeld heeft elk record een nummer van 1 tot 6.

We kunnen ook rijnummers toewijzen met behulp van een kolom. In het onderstaande voorbeeld nummeren we records gesorteerd op naam. We doen dit door dat argument door te geven aan OVER samen met ORDER BY (het sorteert records volgens de naamkolom):

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

Als je naar de resultatenset kijkt, zie je de gesorteerde rijen met hun nummers:

rij naam code
1 bed 101
2 boekenkast 123
3 stoel 333
4 bureau 766
5 bank 202
6 tabel 235

De nummering geleverd door ROW_NUMBER() is onafhankelijk van de volgorde van rijen in de resultatentabel. In het onderstaande voorbeeld nummeren we records met de gesorteerde kolomnaam (OVER(ORDER BY name) ), maar we geven records in de resultaatset weer volgens een andere kolom (in ons voorbeeld ORDER BY code ).

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

De query retourneerde het nummer elke rij, maar deze nummers zijn niet in oplopende volgorde, omdat records worden gesorteerd op basis van kolomcode:

rij naam code
1 bed 101
2 boekenkast 123
5 bank 202
6 tabel 235
3 stoel 333
4 bureau 766

De standaardvolgorde van de gesorteerde rijen is oplopend, maar u kunt ook in aflopende volgorde sorteren met de DESC trefwoord achter de naam van de kolom waarop u wilt sorteren:

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

De bovenstaande zoekopdracht leverde de resultatenset op:

rij naam code
4 bureau 766
3 stoel 333
6 tabel 235
5 bank 202
2 boekenkast 123
1 bed 101

  1. Postgresql-gebruikerswachtwoord genereren

  2. Reflectie in PLSQL?

  3. String splitsen in rijen Oracle SQL

  4. Wat is het ideale gegevenstype om te gebruiken bij het opslaan van breedtegraad / lengtegraad in een MySQL-database?