使用 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)
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 对数据进行分组的主要内容,如果未能解决你的问题,请参考以下文章