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

Transformujte data na časové období v MYSQL ---jak zacházet s mezerami v datech

Tento přístup je pro MySQL. Využívá kombinaci proměnných v rámci uspořádaného dílčího dotazu ke stanovení společného počátečního data pro každý "rozsah". CROSS JOIN se používá pouze k inicializaci proměnných, nemění počet řádků. Jakmile je stanoveno společné počáteční datum, stane se jednoduchou skupinou dotazu ve vnějším dotazu.

SELECT Item, LOC, RP_IND, dr_begin, MAX(RP_DATE) dr_end
FROM (
  SELECT
         mytable.*
       , @fin := CONVERT(IF(@item<=>item AND @loc<=>loc AND DATEDIFF(rp_date, @d)=1, @fin, rp_date), DATE) AS dr_begin
       , @item := item
       , @loc := loc
       , @d := rp_date
  FROM     mytable CROSS JOIN (SELECT @item:=NULL, @loc:=NULL, @d:=NULL, @fin := NULL) AS init
  ORDER BY item, loc, rp_date
  ) d
GROUP BY  Item, LOC, RP_IND, dr_begin
;

+----+------------+-----+--------+------------+---------------------+
|    |    Item    | LOC | RP_IND |  dr_begin  |       dr_end        |
+----+------------+-----+--------+------------+---------------------+
|  1 | 1003785256 | 543 | Y      | 2016-11-05 | 07.11.2016 00:00:00 |
|  2 | 1003785256 | 543 | Y      | 2016-11-09 | 10.11.2016 00:00:00 |
|  3 | 1003790365 | 150 | Y      | 2016-11-05 | 05.11.2016 00:00:00 |
|  4 | 1003797790 | 224 | Y      | 2016-11-05 | 08.11.2016 00:00:00 |
+----+------------+-----+--------+------------+---------------------+

Poznámka <=> vrátí 1, pokud jsou oba operandy NULL

Podívejte se na dotaz fungující na adrese:http://rextester.com/SEYG96251

#drop table mytable;

CREATE TABLE mytable(
   Item    INTEGER  NOT NULL
  ,LOC     INTEGER  NOT NULL
  ,RP_DATE DATE  NOT NULL
  ,RP_IND  VARCHAR(1) NOT NULL
);
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-06','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-07','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-09','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003785256,543,'2016-11-10','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003790365,150,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-05','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-06','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-07','Y');
INSERT INTO mytable(Item,LOC,RP_DATE,RP_IND) VALUES (1003797790,224,'2016-11-08','Y');



  1. Upozornění:neočekávaný znak na vstupu:(ascii=29) stav=0 palců

  2. Doporučené postupy:Sledování zobrazení bannerů

  3. Syntaxe MySQL pro nastavení výchozího data

  4. Jak vytvořit událost, která běží každých 24 hodin?