MySQL'de sıralama işlevi


155

Müşterilerin rütbesini bulmam gerek. Burada benim gereksinim için karşılık gelen ANSI standart SQL sorgusu ekliyorum. Lütfen MySQL'e dönüştürmeme yardım edin.

SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender], 
  FirstName, 
  Age,
  Gender 
FROM Person

MySQL'de sıralamayı bulmak için herhangi bir işlev var mı?

Yanıtlar:


266

Bir seçenek, aşağıdakiler gibi bir sıralama değişkeni kullanmaktır:

SELECT    first_name,
          age,
          gender,
          @curRank := @curRank + 1 AS rank
FROM      person p, (SELECT @curRank := 0) r
ORDER BY  age;

(SELECT @curRank := 0)Parçası, ayrı bir gerektirmeden değişken başlatma sağlarSET komutu.

Test durumu:

CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));

INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');

Sonuç:

+------------+------+--------+------+
| first_name | age  | gender | rank |
+------------+------+--------+------+
| Kathy      |   18 | F      |    1 |
| Jane       |   20 | F      |    2 |
| Nick       |   22 | M      |    3 |
| Bob        |   25 | M      |    4 |
| Anne       |   25 | F      |    5 |
| Jack       |   30 | M      |    6 |
| Bill       |   32 | M      |    7 |
| Steve      |   36 | M      |    8 |
+------------+------+--------+------+
8 rows in set (0.02 sec)

52
Bu sıralı satır içi başlatma için +1, bu çok güzel bir numara.
Charles

28
Yine de bir bölüm istemedi mi? Bölümleri anlamam, sonuç kümesinin erkek ve kadın için ayrı sıralara sahip olacağıdır.
Jesse Dhillon

2
@Jesse: Durum böyleyse, son zamanlarda benzer bir soruyu cevapladım: stackoverflow.com/questions/3162389/multiple-ranks-in-one-table
Daniel Vassallo

6
Anne ve Bob'a 4 olarak rütbe vermek istersem ne olur?
Fahim Parkar

8
Bu partition by gender, analitik işlevin bir kısmını ( genel sonuç için değil cinsiyet başına sıra değerini "numaralayan" )
kaçırdığı için soruyu örneklemez

53

İşte satırlara bölme üzerinde yoğun rütbe atanan genel bir çözüm. Kullanıcı değişkenlerini kullanır:

CREATE TABLE person (
    id INT NOT NULL PRIMARY KEY,
    firstname VARCHAR(10),
    gender VARCHAR(1),
    age INT
);

INSERT INTO person (id, firstname, gender, age) VALUES
(1,  'Adams',  'M', 33),
(2,  'Matt',   'M', 31),
(3,  'Grace',  'F', 25),
(4,  'Harry',  'M', 20),
(5,  'Scott',  'M', 30),
(6,  'Sarah',  'F', 30),
(7,  'Tony',   'M', 30),
(8,  'Lucy',   'F', 27),
(9,  'Zoe',    'F', 30),
(10, 'Megan',  'F', 26),
(11, 'Emily',  'F', 20),
(12, 'Peter',  'M', 20),
(13, 'John',   'M', 21),
(14, 'Kate',   'F', 35),
(15, 'James',  'M', 32),
(16, 'Cole',   'M', 25),
(17, 'Dennis', 'M', 27),
(18, 'Smith',  'M', 35),
(19, 'Zack',   'M', 35),
(20, 'Jill',   'F', 25);

SELECT person.*, @rank := CASE
    WHEN @partval = gender AND @rankval = age THEN @rank
    WHEN @partval = gender AND (@rankval := age) IS NOT NULL THEN @rank + 1
    WHEN (@partval := gender) IS NOT NULL AND (@rankval := age) IS NOT NULL THEN 1
END AS rnk
FROM person, (SELECT @rank := NULL, @partval := NULL, @rankval := NULL) AS x
ORDER BY gender, age;

Değişken atamalarının CASEifadenin içine yerleştirildiğine dikkat edin . Bu (teoride) değerlendirme meselesinin sırasına dikkat eder. IS NOT NULL tipi dönüştürme ve kısa devre sorunlarını ele almak için eklenir.

Not: Bağlamayı kontrol eden tüm koşulları kaldırarak bölüm üzerinde satır numarasına kolayca dönüştürülebilir.

| id | firstname | gender | age | rank |
|----|-----------|--------|-----|------|
| 11 | Emily     | F      | 20  | 1    |
| 20 | Jill      | F      | 25  | 2    |
| 3  | Grace     | F      | 25  | 2    |
| 10 | Megan     | F      | 26  | 3    |
| 8  | Lucy      | F      | 27  | 4    |
| 6  | Sarah     | F      | 30  | 5    |
| 9  | Zoe       | F      | 30  | 5    |
| 14 | Kate      | F      | 35  | 6    |
| 4  | Harry     | M      | 20  | 1    |
| 12 | Peter     | M      | 20  | 1    |
| 13 | John      | M      | 21  | 2    |
| 16 | Cole      | M      | 25  | 3    |
| 17 | Dennis    | M      | 27  | 4    |
| 7  | Tony      | M      | 30  | 5    |
| 5  | Scott     | M      | 30  | 5    |
| 2  | Matt      | M      | 31  | 6    |
| 15 | James     | M      | 32  | 7    |
| 1  | Adams     | M      | 33  | 8    |
| 18 | Smith     | M      | 35  | 9    |
| 19 | Zack      | M      | 35  | 9    |

Demo db <> keman


2
Bu çözüm veya Mukesh'in çözümü doğru çözüm olmalıdır. Her ne kadar teknik olarak her ikinizin de çözümlerinin sıradanlığı değil yoğun bir sıralamayı temsil ettiğine inanıyorum . İşte farklılıkların iyi bir açıklaması: sqlservercurry.com/2009/04/… .
modulitos

.Php kodunun tam olarak nasıl olması gerektiğini de bize bildirir misiniz? Takip etmeye çalıştım, ancak yukarıdaki kod çalışmıyor. .Php biçimine nasıl girilir?
yaratıcısı

Bu çözüm çok genel değil; rank_column'un değeri 0 ise çalışmaz. sqlfiddle.com/#!2/9c5dd/1
mike

1
@mike CASE ifadesine ELSE bölümü ekle:ELSE @rank_count := @rank_count + 1
Prince Odame

1
@abhash ORDER BY gender, age DESC?
Salman A

52

En çok oylanan cevaplar sıralanırken, bölümlenmez, her şeyi bölümlere ayırmak için kendi kendinize Katılabilirsin:

SELECT    a.first_name,
      a.age,
      a.gender,
        count(b.age)+1 as rank
FROM  person a left join person b on a.age>b.age and a.gender=b.gender 
group by  a.first_name,
      a.age,
      a.gender

Kullanım Durumu

CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));

INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');

Cevap :

Bill    32  M   4
Bob     25  M   2
Jack    30  M   3
Nick    22  M   1
Steve   36  M   5
Anne    25  F   3
Jane    20  F   2
Kathy   18  F   1

bu harika bir cevap çünkü bölüm sıralaması yapmam gerekiyor. Teşekkürler bayım!
Kim Stacks

IMO, @Sam Kidman'ın cevabındaki alt seçimle aynı karmaşıklığa sahiptir: O (n ^ 2). Ama MySQL'de daha iyisini yapmanın mümkün olup olmadığını bilmiyorum.
17'de xmedeko

Aynı hatlar boyunca harika bir eğitim için onlamp.com/pub/a/mysql/2007/03/29/… adresini ziyaret edin
ferics2

Rütbe almak için kendi kendine katıl! Bu harika. Sonunda, değişken ve MySQL 8 pencere fonksiyonları olmadan bir çözüm . :)
Timo

24

Rütbe ile birlikte yüzdelik hesaplamak için Daniel'in sürümü bir tweak. Ayrıca aynı işaretlere sahip iki kişi aynı rütbeye sahip olacak.

set @totalStudents = 0;
select count(*) into @totalStudents from marksheets;
SELECT id, score, @curRank := IF(@prevVal=score, @curRank, @studentNumber) AS rank, 
@percentile := IF(@prevVal=score, @percentile, (@totalStudents - @studentNumber + 1)/(@totalStudents)*100),
@studentNumber := @studentNumber + 1 as studentNumber, 
@prevVal:=score
FROM marksheets, (
SELECT @curRank :=0, @prevVal:=null, @studentNumber:=1, @percentile:=100
) r
ORDER BY score DESC

Örnek veriler için sorgu sonuçları -

+----+-------+------+---------------+---------------+-----------------+
| id | score | rank | percentile    | studentNumber | @prevVal:=score |
+----+-------+------+---------------+---------------+-----------------+
| 10 |    98 |    1 | 100.000000000 |             2 |              98 |
|  5 |    95 |    2 |  90.000000000 |             3 |              95 |
|  6 |    91 |    3 |  80.000000000 |             4 |              91 |
|  2 |    91 |    3 |  80.000000000 |             5 |              91 |
|  8 |    90 |    5 |  60.000000000 |             6 |              90 |
|  1 |    90 |    5 |  60.000000000 |             7 |              90 |
|  9 |    84 |    7 |  40.000000000 |             8 |              84 |
|  3 |    83 |    8 |  30.000000000 |             9 |              83 |
|  4 |    72 |    9 |  20.000000000 |            10 |              72 |
|  7 |    60 |   10 |  10.000000000 |            11 |              60 |
+----+-------+------+---------------+---------------+-----------------+

1
Bu performansta gerçekten optimal olmasa da, harika!
Gaspa79

18

Daniel ve Salman'ın cevabının birleşimi. Ancak rütbeler, bağlarla devam eden diziler devam ettikçe verilmeyecektir. Bunun yerine rütbeyi bir sonrakine atlar. Böylece maksimum daima satır sayısına ulaşır.

    SELECT    first_name,
              age,
              gender,
              IF(age=@_last_age,@curRank:=@curRank,@curRank:=@_sequence) AS rank,
              @_sequence:=@_sequence+1,@_last_age:=age
    FROM      person p, (SELECT @curRank := 1, @_sequence:=1, @_last_age:=0) r
    ORDER BY  age;

Şema ve Test Durumu:

CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));

INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');
INSERT INTO person VALUES (9, 'Kamal', 25, 'M');
INSERT INTO person VALUES (10, 'Saman', 32, 'M');

Çıktı:

+------------+------+--------+------+--------------------------+-----------------+
| first_name | age  | gender | rank | @_sequence:=@_sequence+1 | @_last_age:=age |
+------------+------+--------+------+--------------------------+-----------------+
| Kathy      |   18 | F      |    1 |                        2 |              18 |
| Jane       |   20 | F      |    2 |                        3 |              20 |
| Nick       |   22 | M      |    3 |                        4 |              22 |
| Kamal      |   25 | M      |    4 |                        5 |              25 |
| Anne       |   25 | F      |    4 |                        6 |              25 |
| Bob        |   25 | M      |    4 |                        7 |              25 |
| Jack       |   30 | M      |    7 |                        8 |              30 |
| Bill       |   32 | M      |    8 |                        9 |              32 |
| Saman      |   32 | M      |    8 |                       10 |              32 |
| Steve      |   36 | M      |   10 |                       11 |              36 |
+------------+------+--------+------+--------------------------+-----------------+

1
MySQL'de yeniyim ama bu çözüm iyi mi? MySQL dokümanlarında "kullanıcı değişkenlerini içeren ifadeler için değerlendirme sırası tanımsız" diyor. dev.mysql.com/doc/refman/5.7/en/user-variables.html
narduk

13

MySQL 8 ile başlayarak, sonunda MySQL'de de pencere fonksiyonlarını kullanabilirsiniz: https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

Sorgunuz tam olarak aynı şekilde yazılabilir:

SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS `Partition by Gender`, 
  FirstName, 
  Age,
  Gender 
FROM Person

Yanlış değil sadece eski SQL sürümleriyle çalışmaz. artı bir nevi kopya ve geçmişin sorusuydu, bu yüzden cevaba uyuyormuş gibi hissetmiyor.
newdark-it

4
@ brand-it MySQL 8+ sürümüne sahip olanlar için bu cevap önemlidir çünkü Sıralamanın artık kullanılabilir olduğunu bize bildirir. Eğer bu kadar aşağı kaydırmamış olsaydım, daha önceki cevapların tek çözüm olduğunu varsayıyordum.
Steve Smith

1
@SteveSmith İyi nokta, MYSQL'in daha yeni sürümünü kullananlar için bu cevaba sahip olmak güzel.
newdark-it

Evet, kullanıcı değişkenleri ve mantık blokları ile birçok cevaptan vazgeçiyorum. MySQL'in yeni sürümleri, bölümlere göre yerleşik bir gruplama sunan RANK () işleviyle bunu ÇOK basit hale getirir.
James Bond

5

@Sam, sizin açınızdan mükemmel bir kavram ama MySQL belgelerinin referans verilen sayfada söylediklerini yanlış anladığınızı düşünüyorum - ya da yanlış anladım :-) - ve bunu eklemek istedim, böylece birisi @ Daniel'in cevabı daha güvende olacaklar ya da en azından biraz daha derine inecekler.

"@curRank := @curRank + 1 AS rank"İçinde SELECT"tek bir ifade" olmadığını görüyorsunuz , bu ifadenin "atomik" bir parçası olduğu için güvenli olmalı.

Referans verdiğiniz belge, ifadenin 2 (atomik) parçasındaki aynı kullanıcı tanımlı değişkenin, örneğin, örneklerini göstermeye devam eder "SELECT @curRank, @curRank := @curRank + 1 AS rank".

Birisi @curRank@ Daniel'in cevabında iki kez kullanıldığını iddia edebilir : (1) "@curRank := @curRank + 1 AS rank"ve (2) "(SELECT @curRank := 0) r"ancak ikinci kullanım,FROM maddenin yan tümcesi olduğundan, ilk olarak değerlendirilmesinin garanti edildiğinden eminim; aslında ikinci ve daha önceki bir ifadedir.

Aslında, başvuruda bulunduğunuz aynı MySQL dokümanlar sayfasında, yorumlarda aynı çözümü göreceksiniz - @Daniel'in nereden geldiğini; evet, bunun yorum olduğunu biliyorum ama resmi dokümanlar sayfasındaki yorumlar ve bu biraz ağırlık taşıyor.


Bunların hiçbiri belgeler tarafından doğrulanmamıştır. Sadece (bulanık) spekülasyon. Her ne kadar el kitabının açıkça tanımlanmadığı aynı değişkeni kullanması ve yazması gibi tüm cevaplar da vardır, ancak el kitabında beklediğiniz gibi ne işe yarayabileceğini, ne beklediğinizi düşündüğünü veya ne kullandığını söylemeden garanti edilmeyen davranışın açıklamasıdır. PS 8.0 dışında, SET dışındaki değişken atamalar kullanımdan kaldırılmıştır.
philipxy

4

Belirli bir değerin sırasını belirlemek için en basit çözüm, değer sayısını saymaktır önündeki . Aşağıdaki değerlere sahip olduğumuzu varsayalım:

10 20 30 30 30 40
  • Tüm 30değerler 3. olarak kabul edilir
  • Tüm 40değerler 6. olarak kabul edilir (sıralama) veya 4. (yoğun sıralama) olarak kabul edilir

Şimdi orijinal soruya dönelim. OP'de açıklandığı gibi sıralanan bazı örnek veriler aşağıdadır (beklenen sıralar sağa eklenmiştir):

+------+-----------+------+--------+    +------+------------+
| id   | firstname | age  | gender |    | rank | dense_rank |
+------+-----------+------+--------+    +------+------------+
|   11 | Emily     |   20 | F      |    |    1 |          1 |
|    3 | Grace     |   25 | F      |    |    2 |          2 |
|   20 | Jill      |   25 | F      |    |    2 |          2 |
|   10 | Megan     |   26 | F      |    |    4 |          3 |
|    8 | Lucy      |   27 | F      |    |    5 |          4 |
|    6 | Sarah     |   30 | F      |    |    6 |          5 |
|    9 | Zoe       |   30 | F      |    |    6 |          5 |
|   14 | Kate      |   35 | F      |    |    8 |          6 |
|    4 | Harry     |   20 | M      |    |    1 |          1 |
|   12 | Peter     |   20 | M      |    |    1 |          1 |
|   13 | John      |   21 | M      |    |    3 |          2 |
|   16 | Cole      |   25 | M      |    |    4 |          3 |
|   17 | Dennis    |   27 | M      |    |    5 |          4 |
|    5 | Scott     |   30 | M      |    |    6 |          5 |
|    7 | Tony      |   30 | M      |    |    6 |          5 |
|    2 | Matt      |   31 | M      |    |    8 |          6 |
|   15 | James     |   32 | M      |    |    9 |          7 |
|    1 | Adams     |   33 | M      |    |   10 |          8 |
|   18 | Smith     |   35 | M      |    |   11 |          9 |
|   19 | Zack      |   35 | M      |    |   11 |          9 |
+------+-----------+------+--------+    +------+------------+

Sarah için hesaplamak RANK() OVER (PARTITION BY Gender ORDER BY Age)için şu sorguyu kullanabilirsiniz:

SELECT COUNT(id) + 1 AS rank, COUNT(DISTINCT age) + 1 AS dense_rank
FROM testdata
WHERE gender = (SELECT gender FROM testdata WHERE id = 6)
AND age < (SELECT age FROM testdata WHERE id = 6)

+------+------------+
| rank | dense_rank |
+------+------------+
|    6 |          5 |
+------+------------+

Tümü için hesaplamak RANK() OVER (PARTITION BY Gender ORDER BY Age)için satırları bu sorguyu kullanabilirsiniz:

SELECT testdata.id, COUNT(lesser.id) + 1 AS rank, COUNT(DISTINCT lesser.age) + 1 AS dense_rank
FROM testdata
LEFT JOIN testdata AS lesser ON lesser.age < testdata.age AND lesser.gender = testdata.gender
GROUP BY testdata.id

Ve işte sonuç (birleştirilmiş değerler sağda eklenir):

+------+------+------------+    +-----------+-----+--------+
| id   | rank | dense_rank |    | firstname | age | gender |
+------+------+------------+    +-----------+-----+--------+
|   11 |    1 |          1 |    | Emily     |  20 | F      |
|    3 |    2 |          2 |    | Grace     |  25 | F      |
|   20 |    2 |          2 |    | Jill      |  25 | F      |
|   10 |    4 |          3 |    | Megan     |  26 | F      |
|    8 |    5 |          4 |    | Lucy      |  27 | F      |
|    6 |    6 |          5 |    | Sarah     |  30 | F      |
|    9 |    6 |          5 |    | Zoe       |  30 | F      |
|   14 |    8 |          6 |    | Kate      |  35 | F      |
|    4 |    1 |          1 |    | Harry     |  20 | M      |
|   12 |    1 |          1 |    | Peter     |  20 | M      |
|   13 |    3 |          2 |    | John      |  21 | M      |
|   16 |    4 |          3 |    | Cole      |  25 | M      |
|   17 |    5 |          4 |    | Dennis    |  27 | M      |
|    5 |    6 |          5 |    | Scott     |  30 | M      |
|    7 |    6 |          5 |    | Tony      |  30 | M      |
|    2 |    8 |          6 |    | Matt      |  31 | M      |
|   15 |    9 |          7 |    | James     |  32 | M      |
|    1 |   10 |          8 |    | Adams     |  33 | M      |
|   18 |   11 |          9 |    | Smith     |  35 | M      |
|   19 |   11 |          9 |    | Zack      |  35 | M      |
+------+------+------------+    +-----------+-----+--------+

3

Sadece bir kişiyi sıralamak istiyorsanız aşağıdakileri yapabilirsiniz:

SELECT COUNT(Age) + 1
 FROM PERSON
WHERE(Age < age_to_rank)

Bu sıralama oracle RANK işlevine karşılık gelir (Aynı yaştaki insanlarınız varsa aynı rütbeyi alırlar ve bundan sonraki sıralama ardışık değildir).

Yukarıdaki çözümlerden birini bir alt sorguda kullanmaktan ve bir kişinin sıralamasını almak için bundan biraz daha hızlıdır.

Bu herkesi sıralamak için kullanılabilir, ancak yukarıdaki çözümlerden daha yavaştır.

SELECT
  Age AS age_var,
(
  SELECT COUNT(Age) + 1
  FROM Person
  WHERE (Age < age_var)
 ) AS rank
 FROM Person

Tablodaki satır sayısı arttığında yukarıdaki çözümlerden çok daha yavaş olabilir Person. S O (n ^ 2) v O (n) yavaş olur.
17'de xmedeko

2

Daniel'in ve Salman'ın cevaplarının birleşimiyle Erandac'ın cevabındaki " ancak " önlemek için , biri aşağıdaki "bölüm geçici çözümlerinden" birini kullanabilir

SELECT customerID, myDate

  -- partition ranking works only with CTE / from MySQL 8.0 on
  , RANK() OVER (PARTITION BY customerID ORDER BY dateFrom) AS rank, 

  -- Erandac's method in combination of Daniel's and Salman's
  -- count all items in sequence, maximum reaches row count.
  , IF(customerID=@_lastRank, @_curRank:=@_curRank, @_curRank:=@_sequence+1) AS sequenceRank
  , @_sequence:=@_sequence+1 as sequenceOverAll

  -- Dense partition ranking, works also with MySQL 5.7
  -- remember to set offset values in from clause
  , IF(customerID=@_lastRank, @_nxtRank:=@_nxtRank, @_nxtRank:=@_nxtRank+1 ) AS partitionRank
  , IF(customerID=@_lastRank, @_overPart:=@_overPart+1, @_overPart:=1 ) AS partitionSequence

  , @_lastRank:=customerID
FROM myCustomers, 
  (SELECT @_curRank:=0, @_sequence:=0, @_lastRank:=0, @_nxtRank:=0, @_overPart:=0 ) r
ORDER BY customerID, myDate

Bu kod pasajındaki 3. varyanttaki bölüm sıralaması, sürekli sıralama numaralarını döndürür. bu, rank() over partition bysonuca benzer bir veri yapısına yol açacaktır . Örnek olarak aşağıya bakınız. Özellikle, partitionSequence her yeni partitionRank için her zaman şu yöntemi kullanarak 1 ile başlar :

customerID    myDate   sequenceRank (Erandac)
                          |    sequenceOverAll
                          |     |   partitionRank
                          |     |     | partitionSequence
                          |     |     |    | lastRank
... lines ommitted for clarity
40    09.11.2016 11:19    1     44    1   44    40
40    09.12.2016 12:08    1     45    1   45    40
40    09.12.2016 12:08    1     46    1   46    40
40    09.12.2016 12:11    1     47    1   47    40
40    09.12.2016 12:12    1     48    1   48    40
40    13.10.2017 16:31    1     49    1   49    40
40    15.10.2017 11:00    1     50    1   50    40
76    01.07.2015 00:24    51    51    2    1    76
77    04.08.2014 13:35    52    52    3    1    77
79    15.04.2015 20:25    53    53    4    1    79
79    24.04.2018 11:44    53    54    4    2    79
79    08.10.2018 17:37    53    55    4    3    79
117   09.07.2014 18:21    56    56    5    1   117
119   26.06.2014 13:55    57    57    6    1   119
119   02.03.2015 10:23    57    58    6    2   119
119   12.10.2015 10:16    57    59    6    3   119
119   08.04.2016 09:32    57    60    6    4   119
119   05.10.2016 12:41    57    61    6    5   119
119   05.10.2016 12:42    57    62    6    6   119
...

0
select id,first_name,gender,age,
rank() over(partition by gender order by age) rank_g
from person

CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1));

INSERT INTO person VALUES (1, 'Bob', 25, 'M');
INSERT INTO person VALUES (2, 'Jane', 20, 'F');
INSERT INTO person VALUES (3, 'Jack', 30, 'M');
INSERT INTO person VALUES (4, 'Bill', 32, 'M');
INSERT INTO person VALUES (5, 'Nick', 22, 'M');
INSERT INTO person VALUES (6, 'Kathy', 18, 'F');
INSERT INTO person VALUES (7, 'Steve', 36, 'M');
INSERT INTO person VALUES (8, 'Anne', 25, 'F');
INSERT INTO person VALUES (9,'AKSH',32,'M');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.