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