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

Součtový rozsah dat bez počítání překryvů v mysql

Je to hektické jako cokoliv jiného, ​​ale mělo by vám přinést to, co potřebujete:

SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months
  FROM (
    SELECT MIN(g.start_date) start_date, MAX(g.end_date) end_date 
      FROM (
        SELECT @group_id := @group_id + (@end_date IS NULL OR o.start_date > @end_date) group_id,
               start_date,
               @end_date := DATE(CASE 
                 WHEN (@end_date IS NULL OR o.start_date > @end_date) THEN o.end_date
                 ELSE GREATEST(o.end_date, @end_date)
               END) end_date  
          FROM overlap o
          JOIN (SELECT @group_id := 0, @end_date := NULL) init
      ORDER BY o.start_date ASC  
            ) g
  GROUP BY  g.group_id  
        ) a

Nejvnitřnější dotaz seskupuje vaše období v překrývajících se skupinách, kde je to vhodné a roztahuje end_date. End_date se mění, protože jsem předpokládal, že mohou existovat tečky zcela uzavřené předchozím.

Další zalamovací dotaz extrahuje celý rozsah z každé skupiny.

Vnější dotaz shrnuje rozdíly za celý měsíc pro každou skupinu. Všechny skupinové rozdíly jsou zaokrouhleny dolů na nejbližší celý měsíc o PERIOD_DIFF.

Bohužel jsem to nemohl otestovat, protože na mě SQLFiddle zemřel.



  1. Jak donutím Postgres, aby používal konkrétní index?

  2. MySQL:jak provést fulltextové vyhledávání ve více tabulkách

  3. drahokam mysql2 zkompilován pro špatnou klientskou knihovnu mysql

  4. Závažná chyba:Volání nedefinované funkce sqlsrv_connect() v C:\xampp\htdocs