Wynajdywanie lancucha rekordow w tabeli

Odpowiedz Nowy wątek
2018-11-08 10:00
0

Witam,
Jest przykladowa tabela:

MiejsceNr Zajetosc
1 X
2 X
3
4
5 X
6
7 X
8
9
10
11 X
12 X

MiejsceNr to miejsce parkingowe, Zajetosc to X, miejsce wolne to NULL. Mozliwe sa 3 typy samochodow: osobowe ktore potrzebuja jedno miejsce parkingowe, polciezarowki 2 miejsca
i ciezarowki 3 miejsca. Teraz pytanie: jak w najprostszy sposob wyszukac wolne miejsca dla danego typu samochodu. Aktualnie jezeli podjedzie osobowka, system powinien podac
MiejsceNr 3, tak samo dla polciezarowki rowniez 3(bo 3 i 4 wolne), ale juz dla ciezarowki musi to byc 8(8,9,10). Oczywiscie ciagle sie to zmienia wraz z parkowaniem i odjezdzaniem.
Jednym slowem chce wyszukac pierwsza mozliwa luke(miejsceNr), gdzie bedzie pasowal dany typ samochodu.

Pozdrawiam Jaco

edytowany 2x, ostatnio: Jaco99, 2018-11-08 10:03

Pozostało 580 znaków

2018-11-08 15:06
1

Można zrobić z tego co masz widok, który pokaże miejsca obok np. w taki sposób:

MiejsceNr N1 N2 N3
1 X X Y
2 X Y Y
3 Y Y X
4 Y X Y
5 X Y X
6 Y X Y
7 X Y Y
8 Y Y Y
9 Y Y X
10 Y X X
11 X X X
12 X X X

Co można osiągnąć takim zapytaniem:

with dt as (
select 
  "MiejsceNr"
  ,coalesce("Zajetosc",'Y') "Zajetosc"
from
  parking
), dt1 as (
select 
  "MiejsceNr"
  ,coalesce("Zajetosc",'Y') n1,
  coalesce(LEAD ("Zajetosc", 1, 'X') OVER (ORDER BY "MiejsceNr"),'Y') as n2,
  coalesce(LEAD ("Zajetosc", 2, 'X') OVER (ORDER BY "MiejsceNr"),'Y') as n3
from dt)

select * from dt1

reszta to odpowiedni warunek where

dla ciężarówki: where n1 = 'Y' and n2='Y' and n3='Y', półciężarówki where n1 = 'Y' and n2='Y', osobówki: where n1 = 'Y'

np.:

select min("MiejsceNr") miejsce from dt1 where n1 = 'Y' and n2='Y'  and n3='Y'

http://sqlfiddle.com/#!4/ba1ac/35

Pozostało 580 znaków

2018-11-08 20:15
0

Poniższa praca nie moja, zapytałem się na kanale #mysql na FREENODE o te zadanie i uzyskałem pewną/pełną odpowiedź od user'a "snoyes", więc wrzucę tutaj:

select id from (
    select id,
        if(
        x is null,
        null,
        count(*) over (partition by (
       select count(*) from t as t1
       where
        t1.id < t.id
        and t1.x is null),
        x is null)
         ) as c
        from t) as d 
        where c=3;
mysql> select * from t;
+----+------+
| id | x    |
+----+------+
|  1 | NULL |
|  2 |    1 |
|  3 |    1 |
|  4 | NULL |
|  5 |    1 |
|  6 | NULL |
|  7 | NULL |
|  9 |    1 |
| 10 |    1 |
| 11 |    1 |
| 12 | NULL |
+----+------+

Klauzulą where na samym końcu możesz szukać odpowiednich miejsc na parkingu. Np. dla where c=3;, będzie to Id: 9, 10, 11. Zaś dla where c=1;, będzie to Id: 5. Zamysł jest taki, żeby pojazd mniejszy nie wykorzystał miejsca dla większego pojazdu. Jeśli wolałbyś mieć inaczej, to moim zdaniem ten kod nadaje się do łatwej modyfikacji.

https://www.db-fiddle.com/f/m4275jkukN9wut1DiZc7B4/0

edytowany 4x, ostatnio: Neutral, 2018-11-08 20:20

Pozostało 580 znaków

2018-11-08 21:19
2
select 
  miejscenr,  (select min(miejscenr) from ttt where ttt.miejscenr>tabela.miejscenr and zajetosc is not null)-miejscenr ile_wolnych
 from
   ttt tabela
 where tabela.zajetosc is null

Zapytanie pokazuje w których miejscach (tych nullowych) można wstawic jaki samochód

Pozostało 580 znaków

2018-11-09 07:08
0

Dziekuje wszystkim za podpowiedzi i za poswiecony czas, przetestuje w przyszlym tygodniu.

Pozdrowienia Jaco

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0