嘿,这是我的第一个堆栈溢出问题,所以如果我没有以最好的方式提问,请让我知道,我可以添加更多信息.

上下文:

我有一个包含四列的SQL表,名为:

Acc_ID、BLOCK_CATEGORY、开始日期、值

这些列包括: (编号)、(编号)、(日期)、(编号)

该表将对帐户所做的所有更改记录为一个新行,而ACC_ID是与该帐户关联的唯一列.START_DATE是更改的日期.为此,我们可以忽略值列.

我需要运行一个查询来了解所有帐户何时更改为它们所在的当前BLOCK_CATEGORY.我面临的问题是,块类别是数字1-8,它们以前可能在同一个BLOCK_CATEGORY上,但我们需要知道这一次它是什么时候改为它的?

以下是一些帮助您理解的样本数据(对于我的样本,日期格式为DD/MM/YYYY):

ACC_ID BLOCK_CATEGORY START_DATE Value
1001 7 14/08/2022 5
1001 2 16/08/2022 5
1001 7 17/08/2022 10
1001 7 19/08/2022 10
1002 4 14/08/2022 3
1002 3 15/08/2022 3
1002 3 17/08/2022 9
1003 1 14/08/2022 10
1003 1 17/08/2022 13
1004 3 14/08/2022 2
1005 7 14/08/2022 11
1005 2 16/08/2022 34
1005 3 19/08/2022 1
1005 7 21/08/2022 12

这样做的最终结果是:

ACC_ID BLOCK_CATEGORY START_DATE
1001 7 17/08/2022
1002 3 15/08/2022
1003 1 14/08/2022
1004 3 14/08/2022
1005 7 21/08/2022

我希望通过上面的例子和问题让你明白这一点.如果有任何问题,请提出来.

我正在使用的当前查询显示以下不正确的结果:

ACC_ID BLOCK_CATEGORY START_DATE
1001 7 14/08/2022
1002 3 15/08/2022
1003 1 14/08/2022
1004 3 14/08/2022
1005 7 14/08/2022

以下是我正在使用的查询.我们如何才能运行查询来给出正确的期望结果,即它何时更改为当前的BLOCK_CATEGORY.

SELECT *

FROM (

SELECT ACC_ID,
BLOCK_CATEGORY,
START_DATE,
ROW_NUMBER() OVER (PARTITION BY acc_id order by start_date DESC) RowNum

FROM
(
SELECT ACC_ID,
BLOCK_CATEGORY,
MIN(START_DATE) 'START_DATE'

FROM [dbo].[ACCOUNTCHANGES]
WHERE
BLOCK_CATEGORY IS NOT NULL
GROUP BY ACC_ID,BLOCK_CATEGORY
) A
) B
WHERE B.RowNum = 1

推荐答案

典型的缝隙和岛屿方法.停止运行,只保留第一个/最新的运行.

with grp as (
    select *,
        row_number() over (partition by ACC_ID order by START_DATE desc)
          - row_number() over (partition by ACC_ID, BLOCK_CATEGORY order by START_DATE desc)
          + 1 as gn
    from dbo.ACCOUNTCHANGES
)
select ACC_ID, min(BLOCK_CATEGORY), min(START_DATE)
from grp where gn = 1 group by ACC_ID;

+ 1真的不是必须的,如果你喜欢的话,你也可以很容易地筛选出gn = 0.

Sql相关问答推荐

无法找到正确的SQL查询需求

具有2个共享列的两个表的Amazon RSQL合并

如何转换和汇总行数

为什么在这种情况下我不能使用LAG函数?

如何在SQL中按每个子组的顺序更新数据?

为什么在postgres中,横向连接比相关子查询快?

在SQL中使用类别值将行转置为列

计算周时出现SQL错误结果

替换上一个或下一个值中的空值并添加其价格日期

值对于类型字符来说太长

如何将我的联接数据放入每个用户每月多行的列中?

在Postgres中合并相似的表

Redshift PL/pgSQL循环中的参数化列名

在SELECT中将日期格式转换为双周时段

合并分层表SQL中的第一个非空、变化的空位置

使用CTE在SNOWFLAKE中创建临时表

Oracle 21c 中的递归查询回顾过go 3 周

根据开始时间和结束时间计算has_impact字段

如何将多行的查询结果合并为一行

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?