【问题标题】:Contiguous Date Functionality: SAP HANA连续日期功能:SAP HANA
【发布时间】:2018-12-04 15:26:54
【问题描述】:

我们正在尝试从表格中查找连续日期

预期的输出如下图所示: Expected Output

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 得到的附件应该更改结束日期 Our Output

我们如何在SAP HANA SQL中实现

【问题讨论】:

  • 我并不完全清楚你想要实现什么。您是否只想找到最大跨越的日期间隔(即所有跨越的连续日期都存在于表中的间隔)。 ID列有什么影响吗?它似乎不是独一无二的。 “期间”栏怎么样?是否可以包含重复值?

标签: sql hana


【解决方案1】:

您可以在 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

【讨论】:

    【解决方案2】:

    实际上,您正在查找有序表列中数据岛的上限,这类似于查找间隙的下限

    另一种解决方案可以遵循 SQLScript,我使用 SQL LEAD() function 计算日期字段中的下一个值

    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 expressions,这对于许多具有 ABAP 编程经验的 HANA 开发人员来说可能是一种新语法。 但我经常使用它,并且在单个 SELECT 语句中使用多个 CTE 时尤其强大。

    上述 SQLScript 查询的输出如下

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多