Tabibitosan обрабатывает это очень легко:
WITH your_table AS (SELECT to_date('01/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('02/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('03/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('04/01/2017', 'dd/mm/yyyy') daytime, 35000 VALUE FROM dual UNION ALL
SELECT to_date('05/01/2017', 'dd/mm/yyyy') daytime, 35000 VALUE FROM dual UNION ALL
SELECT to_date('06/01/2017', 'dd/mm/yyyy') daytime, 40000 VALUE FROM dual UNION ALL
SELECT to_date('07/01/2017', 'dd/mm/yyyy') daytime, 40000 VALUE FROM dual UNION ALL
SELECT to_date('08/01/2017', 'dd/mm/yyyy') daytime, 50000 VALUE FROM dual UNION ALL
SELECT to_date('09/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual)
-- end of mimicking your table with data in it. See SQL below:
SELECT MIN(daytime) fromdate,
MAX(daytime) todate,
VALUE
FROM (SELECT daytime,
VALUE,
row_number() OVER (ORDER BY daytime) - row_number() OVER (PARTITION BY VALUE ORDER BY daytime) grp
FROM your_table)
GROUP BY grp,
VALUE
ORDER BY MIN(daytime);
FROMDATE TODATE VALUE
---------- ---------- ----------
01/01/2017 03/01/2017 20000
04/01/2017 05/01/2017 35000
06/01/2017 07/01/2017 40000
08/01/2017 08/01/2017 50000
09/01/2017 09/01/2017 20000
Что это делает сравнение номер строки для всех строк упорядоченных по дате, а затем номер строки для всех строк для каждого значения, упорядоченного по дате. Если строки значений являются последовательными в основном наборе данных, то разница между двумя наборами данных остается неизменной, поэтому вы можете группировать ее. Если есть пробел, разница увеличивается.
В приведенном выше примере первые три строки для значения = 20000 являются первыми тремя строками всего набора, поэтому разница будет равна 0. Однако четвертое значение = 20000 строк является 9-й строкой в целом поэтому разница теперь равна 5. Вы можете легко увидеть, что значение 20000 относится к двум группам, и как таковое вы можете найти минимальное/максимальное дневное время для каждой группы отдельно, включив этот разностный расчет в предложение group by.
N.B. Это предполагает, что даты в ваших данных являются последовательными или что если отсутствуют даты, которые вы считаете, значение остается неизменным для отсутствующих дат. Если у вас отсутствуют пропущенные дни, и вы хотите, чтобы значения в пробеле отображались в разных группах, вам необходимо выполнить внешнее соединение с подзапросом, который содержит отсутствующие даты. В этом случае я думаю, что ответ GurV (с дополнительным предложением в заявлении case, который я упомянул в комментариях) был бы лучшим, поскольку это позволит избежать необходимости внешнего соединения в списке последовательных дат.
Бинго! Оно работает! Большое спасибо :) – akira
Не знаете, как вы имеете в виду N.B. - возможно, вы имеете в виду, если в верхней части находятся десять строк, все с значением 20000, но даты - четыре последовательных дня, затем пробел, а затем еще шесть последовательных дней, и это должно производить две строки вместо одной ... Если это то, что вы имеете в виду, тогда незначительная модификация ** Tabibitosan ** может иметь дело с этим напрямую.Чтобы создать 'grp', используйте' daytime' непосредственно вместо первого 'row_number()'; таким образом, значения 'grp' будут представлять собой даты вместо чисел, но все это работает точно так же. – mathguy
Хорошая точка, ta; Я никогда не думал об этом раньше! Будет играть с этим в понедельник * {:-) – Boneist