sql - 使用 PIVOT sqlserver
问题描述
我有下表:
表格1
COD_USER | 日期 | 地位 |
---|---|---|
1 | 2020-04-01 | 积极的 |
1 | 2020-06-30 | 不活跃 |
1 | 2020-12-01 | 积极的 |
有了这些数据,我需要生成以下输出:
表2
COD_USER | 开始日期 | 结束日期 |
---|---|---|
1 | 2020-04-01 | 2020-06-30 |
1 | 2020-12-01 | 无效的 |
我正在尝试为此使用 PIVOT,但我不知道这是否可行。
解决方案
PIVOT 无法帮助的部分是将记录配对(一个开始/活动和一个结束/不活动)。
如果您知道您将始终在活动和非活动之间交替获取记录(因此永远不要获取active, active, inactive
),并且始终以活动开头,这将为每对记录提供相同的序列号,您可以按该序列号进行分组。
WITH
sorted AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY [COD_USER], [STATUS]
ORDER BY [DATE]
)
AS SEQ
FROM
Table1
)
SELECT
[COD_USER],
MAX(CASE WHEN [STATUS] = 'active' THEN [DATE] END) AS START_DATE,
MAX(CASE WHEN [STATUS] = 'inactive' THEN [DATE] END) AS END_DATE
FROM
sorted
GROUP BY
[SEQ]
编辑
处理任何任意状态顺序的类似方法......
WITH
sorted AS
(
SELECT
*,
LAG([STATUS])
OVER (PARTITION BY [COD_USER]
ORDER BY [DATE]
)
AS PREV_STATUS,
ROW_NUMBER()
OVER (PARTITION BY [COD_USER]
ORDER BY [DATE]
)
AS SEQ
FROM
Table1
)
SELECT
[COD_USER],
MAX(CASE WHEN [STATUS] = 'active' THEN [DATE] END) AS START_DATE,
MAX(CASE WHEN [STATUS] = 'inactive' THEN [DATE] END) AS END_DATE
FROM
sorted
GROUP BY
[SEQ] - CASE WHEN [STATUS] = 'inactive' AND [PREV_STATUS] = 'active' THEN 1 ELSE 0 END
推荐阅读
- python-3.x - 如何在 DataFrame 的时间序列中将月份名称转换为月份编号?
- c++ - 异构初始化列表
- reactjs - 使用 Redux Form 反应选择设置初始值
- apache-flex - 如何从 flex UI 转换为 apache roayle
- boost-asio - 如何从 Boost 1.68 中的链中获取 io_context?
- identityserver4 - 始终在 IdentityServer4 中输入没有“prompt=login”的凭据
- c# - 当我在 C# 中按 Enter 时,Intellisense 没有插入
- json - 在 hive 数据类型中,映射比 JSON 字符串快多少?
- vb.net - 如何在richtextbox中插入编号的项目符号列表
- ruby-on-rails - ChartKick 抛出错误“PG::GroupingError: ERROR:”