Функциональность непрерывной даты: SAP HANA - PullRequest
0 голосов
/ 06 июня 2018

Мы пытаемся найти непрерывную дату из таблицы

Ожидаемый вывод прилагается на изображении ниже: Ожидаемый вывод

create column table "PS_CMP_TIME_ANALYTICS"."Temp2" (
"ID"  integer,
"Period"  date);

INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (4, '2010-04-03');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (5, '2010-04-07');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (2, '2010-04-10');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (3, '2010-04-15');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (6, '2010-04-16');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (7, '2010-04-17');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (3, '2010-04-22');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (4, '2010-04-24');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (7, '2010-04-30');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (2, '2010-05-01');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (5, '2010-05-02');
INSERT INTO "PS_CMP_TIME_ANALYTICS"."Temp2" VALUES (3, '2010-05-03');

Запрос, который мы пытались выполнитьSAP HANA и вывод, который мы получаем, упоминается ниже:

SELECT MIN("Period") AS BeginRange,
       MAX("Period") AS EndRange
FROM (
SELECT "Period",
    --DATEDIFF(D, ROW_NUMBER() OVER(ORDER BY "Period"), "Period") AS DtRange
cast(ROW_NUMBER() OVER(ORDER BY "Period") as date) as xyz,

    days_between(to_date(cast(ROW_NUMBER() OVER(ORDER BY "Period") as 
Date),'YYYY-MM-DD'), "Period") AS DtRange
FROM "PS_CMP_TIME_ANALYTICS"."Temp2") AS dt
GROUP BY DtRange;

Но мы не получаем вывод, как ожидалось, найдем прикрепленный материал, полученный с помощью SAP HANA SQL. Дата окончания должна быть изменена Наш вывод

Как мы можем достичь в SAP HANA SQL

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

На самом деле вы ищете верхнюю границу островков данных в столбцах упорядоченной таблицы, которая аналогична поиску нижних пределов пропусков

Другое решение может быть следующее за SQLScript, где я использовал SQL LEAD ()функция для вычисления следующего значения в поле даты

with cte as (
    select
    "ID", "Period", LEAD("Period", 1) over (order by "Period") NextDate
    from "Temp2"
)
select "ID", "Period"
from cte
where IFNULL(DAYS_BETWEEN("Period",NextDate),9) > 1

Я также использовал выражения SQL CTE , что может стать новым синтаксисом для многих разработчиков HANA, основанных на опыте программирования ABAP.Но я часто его использую и особенно мощнее с несколькими CTE в одном операторе SELECT.

Вывод для приведенного выше запроса SQLScript следующий:

enter image description here

0 голосов
/ 07 июня 2018

Вы можете под кодом в SAP HANA

SELECT MIN("Period") as "Start_Date",MAX("Period") as "End_Date",
(days_between(Min("Period"),Max("Period")) + 1) as "Days"
FROM
(select "Period",add_days("Period" ,- ROW_NUMBER() OVER(ORDER BY "Period"))rn
from "SchemaName"."Temp2")
GROUP BY rn
...