Dieser Ansatz gilt für MySQL. Es verwendet eine Kombinationsvariable innerhalb einer geordneten Unterabfrage, um ein gemeinsames Startdatum für jeden "Bereich" festzulegen. Der CROSS JOIN wird nur zum Initialisieren der Variablen verwendet, er ändert nicht die Anzahl der Zeilen. Sobald das gemeinsame Startdatum festgelegt ist, wird es zu einer einfachen Gruppierung nach Abfrage in der äußeren Abfrage.
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 |
+----+------------+-----+--------+------------+---------------------+
Beachten Sie <=> gibt 1 zurück, wenn beide Operanden NULL sind
Siehe die Abfrage unter: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');