我有一张简单的桌子:

CREATE TABLE ActivityHX (
ITEM_ID         nvarchar(5),
LINE            nvarchar(2),
ACTIVITY_DATE   date,
ACTIVITY        nvarchar(8)
);

INSERT INTO ActivityHX (ITEM_ID, LINE, ACTIVITY_DATE, ACTIVITY)

VALUES

('38003', '1', '20230803', 'OPENED'),
('38003', '2', '20230803', 'CLOSED'),
('38003', '3', '20230812', 'REOPENED'),
('38003', '4', '20230814', 'CLOSED');

这就得出了这样的结果:

ITEM_ID LINE ACTIVITY_DATE ACTIVITY
38003 1 2023-08-03 OPENED
38003 2 2023-08-03 CLOSED
38003 3 2023-08-12 REOPENED
38003 4 2023-08-14 CLOSED

我在这里开始拉小提琴:https://dbfiddle.uk/f9tBIRFz.我正在试图弄清楚如何让我的数据看起来像这样:

ITEM_ID START_DATE END_DATE
38003 2023-08-03 2023-08-03
38003 2023-08-12 2023-08-14

我的数据很简单,遵循一个干净的顺序,大多数项目只有一个开放和关闭日期.但是,当我有多个重新打开日期的项目时,我知道下一行将是关闭的活动.我正在try 解决如何在不获取空值的情况下将数据转置到开始日期和结束日期列.当我try 使用row_number()时,即使我try 在其中使用CASE语句,也会得到空值.

SELECT
 ITEM_ID
,CASE WHEN ACTIVITY IN ('OPENED', 'REOPENED') THEN ACTIVITY_DATE END 'START_DATE'
,CASE WHEN ACTIVITY = 'CLOSED' THEN ACTIVITY_DATE END 'END_DATE'
FROM (
SELECT
 ITEM_ID
,LINE
,ACTIVITY_DATE
,ACTIVITY
,Diff as 'Days Diff'
,ROW_NUMBER() OVER (PARTITION BY ITEM_ID ORDER BY CASE WHEN Diff <= 0 then -1 else 1 end, abs(Diff)) as RN
from mydata) ActivityHX

我已经搜索了各种解决方案,并试图将其拼凑在一起,但我无法将表格展平到只有两行.谢谢你的建议.

推荐答案

SELECT A.ITEM_ID,A.ACTIVITY_DATE AS START_DATE,CL_QUERY.ACTIVITY_DATE AS END_DATE
 FROM ActivityHX AS A
 OUTER APPLY
  (
    SELECT TOP 1 X.ACTIVITY_DATE 
     FROM ActivityHX AS X
     WHERE A.ITEM_ID=X.ITEM_ID AND X.ACTIVITY IN('CLOSED')
     AND A.ACTIVITY_DATE<=X.ACTIVITY_DATE
     ORDER BY X.ACTIVITY_DATE
  )CL_QUERY
  WHERE A.ACTIVITY IN('OPENED','REOPENED')

请试一下这件.

Sql相关问答推荐

SQL查询以条件空值跟踪生产操作结果进展

获取每个帖子的匹配关键字列表

为什么Prisma生成唯一索引,而不是基于方案上的唯一列约束?

更新PostgreSQL 15中的JSON值

如何在presto/SQL中使用两个数组列创建(分解)单独的行

SQL Select 最小优先级

使用generate_series()时,LEFT联接缺少日期/间隔

在xml.Modify方法中使用子字符串和可能的替代方法

更正用于判断错误组合的SQL

如何将insert语句重复n次使一个值递增?

如何修复初学者 SQL INNER JOIN 查询错误

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

特殊条件计算小计

Spark / Hive:如何获取列中正值的百分比?

复制SQL Server临时表

插入行时的行安全策略问题

雅典娜弄错了操作顺序

如何刷新在视图之上创建的表

如何根据时间在 MongoDB Compass 中分组?