Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie SQL, aby uzyskać różnicę między sąsiednimi rekordami

Myślę, że nie ma ucieczki od małego przeformatowania danych, a do tego można użyć tabeli tymczasowej.

Uwaga :Utworzyłem tabelę z liczbami całkowitymi zamiast godzinami jako danymi źródłowymi, aby uniknąć wszystkich obliczeń formatu czasu, ale tak naprawdę jest tak samo.

Utworzone przeze mnie dane źródłowe to:

CREATE TABLE `table` (
`start` INT(11) NOT NULL,
`end` INT(11) NOT NULL,
`type` VARCHAR(6));

INSERT INTO `table` VALUES
(1,3,'A'),
(5,7,'A'),
(6,10,'A'),
(2,6,'B'),
(3,4,'B'),
(5,11,'B'),
(12,13,'B');

Następnie skrypt, którego musisz użyć, aby uzyskać odpowiedź, to:

DROP TABLE IF EXISTS temp;
CREATE TABLE temp (
id int(100) AUTO_INCREMENT,
start int(11) NOT NULL,
type VARCHAR(6),
PRIMARY KEY id (id));

INSERT INTO temp(start, type) 
SELECT start, type FROM table
ORDER BY type, start;

SELECT t1.type, AVG(t1.start - t2.start) AS avg_gap 
FROM temp t1
JOIN temp t2 ON t1.type = t2.type AND t1.id = (t2.id + 1)
WHERE t1.start - t2.start < 5
GROUP BY t1.type;

Wynik:

type   avg_gap
 A     2.5
 B     1.5

EDYTUJ: Zgodnie z twoją nową regułą w edycji:Moja reguła nie polega na obliczaniu przerw większych niż 5 (jak możesz zobaczyć w WHERE klauzula końcowego zapytania). Dlatego ostatnia przerwa typu B została zignorowana.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liczba scaleń Mysql w wielu kolumnach

  2. Nieprawidłowa wartość całkowita „” dla kolumny MySQL, która jest liczbą całkowitą i zezwala na wartość null?

  3. Znaki Unicode stają się znakami zapytania po wstawieniu do bazy danych

  4. Czy mysql może zaimportować plik csv lub inny plik txt do jednej kolumny?

  5. #1411 — Nieprawidłowa wartość daty/godziny dla funkcji str_to_date na INSERT INTO...SELECT