ID |val1 | val2 | val3 | val4| val5| val6

1   NULL   NULL     a     b    NULL  NULL

2   NULL   NULL   NULL    b     c    d

Dla tych dwóch rekordów chcę wyodrębnić 2 i 3 nie wartości null. Pożądany wynik:

ID | 1st | 2nd | 3rd

1.    a    b    NULL

2.    b   c     d

Pozwólcie, że sprecyzuję problem, ponieważ jest to oryginalny format danych, z którymi mam do czynienia. Pomyślałem, że znalezienie wartości N-tej nie jest zerowe, byłoby łatwiejsze. Są 3 sklepy. W każdym sklepie można kupić do 6 produktów. Każdy produkt może otrzymać podwyżkę od 1 do 6 gwiazdek.

Shop_id | prod_id | ocena

1 | a | 2

1 | b | 6

2 | a | 5

2 | b | 6

2 | c | 1

2 | d | 2

3 | a | 3

Chcę uszeregować każdy produkt zgodnie z oceną. Pożądanym wynikiem byłoby:

Shop_id | prod_id | ocena | ranga

1 | a | 2 | 2

1 | b | 6 | 1

2 | a | 5 | 2

2 | b | 6 | 1

2 | c | 1 | 4

2 | d | 2 | 3

3 | a | 3 | 1

Mam nadzieję, że to jasne. Dzięki za pomoc!

0
Bench 19 grudzień 2019, 19:12
Będzie to wymagało dużo pisania...
 – 
jarlh
19 grudzień 2019, 19:14
5
Twój schemat jest zły. Zamiast tego powinieneś mieć id | val | val_id, wtedy byłby to trywialny SELECT TOP 5 * FROM yourtable WHERE val IS NOT NULL;. Twój obecny schemat jest punktem zwrotnym i jako taki będzie koszmarem, aby uzyskać tego typu wyniki.
 – 
JNevill
19 grudzień 2019, 19:14
1
Jakiego DBMS używasz? Dodaj tag.
 – 
sticky bit
19 grudzień 2019, 19:22
1
Którego DBMS produktu używasz? „SQL” to tylko język zapytań, a nie nazwa konkretnego produktu bazodanowego. Dlaczego powinienem otagować mój DBMS
 – 
a_horse_with_no_name
19 grudzień 2019, 19:37

1 odpowiedź

Rozwijając mój komentarz:

Twój schemat byłby lepszy jako id | val_id | val, który z Twoimi danymi wyglądałby następująco:

+----+--------+------+
| id | val_id | val  |
+----+--------+------+
|  1 |      1 | NULL |
|  1 |      2 | NULL |
|  1 |      3 | a    |
|  1 |      4 | b    |
|  1 |      5 | NULL |
|  1 |      6 | NULL |
|  2 |      1 | NULL |
|  2 |      2 | NULL |
|  2 |      3 | NULL |
|  2 |      4 | b    |
|  2 |      5 | c    |
|  2 |      6 | d    |
+----+--------+------+

Abyś mógł odpowiedzieć na swoje pytanie, takie jak:

SELECT <TOP 5> * FROM yourtable ORDER BY id, val_id <LIMIT 5>

Gdzie <TOP 5> i <LIMIT 5> są wymienne w zależności od używanego systemu RDBMS.

Aby Twoje dane wyglądały jak ten lepszy schemat, możesz użyć zapytania UNION:

SELECT id, 1, val1 FROM yourtable
UNION ALL 
SELECT id, 2, val2 FROM yourtable
UNION ALL
SELECT id, 3, val3 FROM yourtable
UNION ALL
SELECT id, 4, val4 FROM yourtable
UNION ALL
SELECT id, 5, val5 FROM yourtable
UNION ALL
SELECT id, 6, val6 FROM yourtable

Możesz wstawić to do podzapytania zamiast yourtable w SQL, które mam powyżej:

SELECT <TOP 5> * 
FROM
    (
        SELECT id, 1, val1 FROM yourtable
        UNION ALL 
        SELECT id, 2, val2 FROM yourtable
        UNION ALL
        SELECT id, 3, val3 FROM yourtable
        UNION ALL
        SELECT id, 4, val4 FROM yourtable
        UNION ALL
        SELECT id, 5, val5 FROM yourtable
        UNION ALL
        SELECT id, 6, val6 FROM yourtable
    ) yourtable 
 ORDER BY id, val_id <LIMIT 5>
0
JNevill 19 grudzień 2019, 19:44
Dziękuję za to. Używam impali i LIMIT w <> nie działa. Pozwól, że trochę przeformułuję mój problem
 – 
Bench
19 grudzień 2019, 23:32
Po prostu zrób ORDER BY id, val_id LIMIT 5 Nie chodziło mi o dosłowne <>. Usuń również <TOP 5>, których używałem tylko jako symboli zastępczych, ponieważ nie określiłeś swojego RDBMS, więc mógł to być TOP lub LIMIT w zależności...
 – 
JNevill
20 grudzień 2019, 00:13
Proszę spojrzeć na początek wątku. Trochę przeformułowałem problem i nie jestem pewien, czy rozwiązanie z limitem zadziała.
 – 
Bench
20 grudzień 2019, 00:19