sql >> Databáze >  >> RDS >> Mysql

Výpočet celkového množství zařízení pro určité časové období

Začal jsem s následujícím SQL, abych shromáždil všechny rozsahy dat, které se protínají s daným rozsahem:

SELECT MAX(available) - IFNULL(SUM(amountInSch), 0)
FROM Table1
LEFT JOIN Table3 USING (eqid)
LEFT JOIN Table2 USING (scheduleid)
WHERE DATE(startDate) <= '2012-08-27' AND DATE(endDate) >= '2012-08-27'
  AND endTime > '08:30' AND startTime < '12:00'
  AND eqid = 1

Husla

Toto je pouze první část. Dále musíte zjistit možné překryvy; to by nebylo praktické pro SQL, takže bych navrhoval udělat to v PHP.

Obecný algoritmus, který bych zvolil, je bohužel O(n**2), vypadá to takto:

  • vytvořte časovou osu (vymezenou každým dnem) s časem jako vodorovnou osou
  • iterujte přes každý rozsah data/času a označte čas jeho levého a pravého okraje, abyste vytvořili časové segmenty každé možné permutace.
  • pomocí segmentů sčítáte vertikálně za překrytí a přebíráte denní maximum.

Doufám, že to pomůže.




  1. Nelze zkrátit tabulku, protože na ni odkazuje omezení FOREIGN KEY - SQL Server / Výukový program TSQL, část 70

  2. Operátory SET v SQL

  3. Vyberte TOP X (nebo dolní) procento pro číselné hodnoty v MySQL

  4. Pokud je zadáno SELECT DISTINCT, položky ORDER BY se musí objevit ve výběrovém seznamu