使用 SQL Hana 对数据进行分组

Posted

技术标签:

【中文标题】使用 SQL Hana 对数据进行分组【英文标题】:Grouping data with SQL Hana 【发布时间】:2021-04-02 15:25:52 【问题描述】:

我有以下数据集结构。

其中列状态表示 1 - 退出,0 - 受雇。我想知道如何编写一个 SQL 查询来分组 通过员工 ID 显示从他们加入(或重新加入)公司到他们退出/结束的时间段。如果员工辞职并稍后重新加入,他们将在不同的独特领域中表现出来。所以生成的数据框应该是这样的:

我正在尝试为 HANA 学习 SQL 方言。并且不太确定如何按 ID 和状态进行分组以处理重新加入的案例。

谢谢!

【问题讨论】:

糟糕,我的错。编辑了最初的帖子以显示对数据的正确解释。基本上由员工从他们加入/重新加入公司到他们退出或已知信息的结束进行分组。 我会以不同的方式解释数据。 2000 年 1 月 1 日至 2000 年 3 月 1 日,员工 1 处于“离职”状态。员工 1 的第一个“已加入”行是从 2002 年 3 月 26 日到 2002 年 5 月 10 日。您的结果将建议前 4 行中的所有状态为 1,按员工 ID 和起始日期排序。需要详细说明吗? 【参考方案1】:

完全忽略你的状态栏;只是依靠行之间的时间间隔。

在此期间看到了您的编辑。这样,您还可以检查 LAG(status) OVER() IS NULL OR LAG(status) OVER() = 0 以进行计数器的计算。

请,请 - 添加您的数据,以便我们可以将它们复制粘贴到工作空间中,而不是耐心地用手敲击它们...

哦 - 我假设(因为我手边没有 SAP HANA) - 在 SAP HANA 中也返回一个整数。否则,请使用 DAYS_BETWEEN() ...

WITH 
-- your input as table "indata"
indata(emp_id,dt_from,dt_to,status) AS (
            SELECT 1,DATE '2000-01-01',DATE '2000-03-01',1
  UNION ALL SELECT 1,DATE '2000-03-02',DATE '2000-06-25',1
  UNION ALL SELECT 1,DATE '2000-06-26',DATE '2002-03-25',1
  UNION ALL SELECT 1,DATE '2002-03-26',DATE '2002-05-10',1
  UNION ALL SELECT 1,DATE '2005-02-15',DATE '2005-07-01',1
  UNION ALL SELECT 1,DATE '2005-07-02',DATE '2005-09-03',1
  UNION ALL SELECT 1,DATE '2005-09-04',DATE '2006-02-11',1
  UNION ALL SELECT 2,DATE '2000-08-02',DATE '2000-11-20',1
  UNION ALL SELECT 2,DATE '2000-11-21',DATE '2001-08-12',1
  UNION ALL SELECT 2,DATE '2001-08-13',DATE '2002-02-15',1
)
-- ignore existing "status"; just rely on gaps in the time line;
-- add a counter that is at 0 when first row or no gap to 
-- predecessor, else at 1
,
with_counter AS (
  SELECT
    emp_id
  , dt_from
  , dt_to
  , dt_from - LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) as gapsize
  , CASE WHEN LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) IS NULL 
           OR dt_from - LAG(dt_to) OVER(PARTITION BY emp_id ORDER BY dt_from) = 1
         THEN 0
         ELSE 1
    END AS counter
  FROM indata
)
-- create a session id as running sum previous counter
,
with_session AS (
  SELECT
    *
  , SUM(counter) OVER(PARTITION BY emp_id ORDER BY dt_from) AS sess_id
  FROM with_counter
)
SELECT
  emp_id
, MIN(dt_from) AS dt_from
, MAX(dt_to)   AS dt_to
FROM with_session
GROUP BY 
  emp_id
, sess_id
ORDER BY
  emp_id
, 2
;
-- out  emp_id |  dt_from   |   dt_to    
-- out --------+------------+------------
-- out       1 | 2000-01-01 | 2002-05-10
-- out       1 | 2005-02-15 | 2006-02-11
-- out       2 | 2000-08-02 | 2002-02-15

【讨论】:

以上是关于使用 SQL Hana 对数据进行分组的主要内容,如果未能解决你的问题,请参考以下文章

按 JSON 数组对 SQL 数据进行分组

有没有办法使用自定义分组对 SQL 中的输出数据进行排序?

使用 SQL 对具有共同状态的连续项目进行分组(包括虚拟数据)

SQL - 按最新更新对数据进行分组

如何按 id 对数据进行分组并使用 SQL 获取中值?

sql 2005 对动态数据进行分组