gpt4 book ai didi

sql - 如何过滤 SQL 查询以获取所需的行

转载 作者:行者123 更新时间:2023-12-03 08:02:23 25 4
gpt4 key购买 nike

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

上下文:

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

ACC_ID、BLOCK_CATEGORY、START_DATE、VALUE

这些列是:(数字),(数字),(日期),(数字)

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

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

这里有一些示例数据可以帮助您理解(对于我的示例,日期格式为 DD/MM/YYYY):

<表类=“s-表”><标题>ACC_IDBLOCK_CATEGORYSTART_DATE值 <正文>100172022年8月14日5100122022年8月16日5100172022年8月17日10100172022年8月19日10100242022年8月14日3100232022年8月15日3100232022年8月17日9100312022年8月14日10100312022年8月17日13100432022年8月14日2100572022年8月14日11100522022年8月16日34100532022年8月19日1100572022年8月21日12

期望的最终结果是:

<表类=“s-表”><标题>ACC_IDBLOCK_CATEGORYSTART_DATE <正文>100172022年8月17日100232022年8月15日100312022年8月14日100432022年8月14日100572022年8月21日

希望通过上面的例子和问题你能明白这个必要性。有任何问题请提出。

我当前使用的查询给出了以下错误结果:

<表类=“s-表”><标题>ACC_IDBLOCK_CATEGORYSTART_DATE <正文>100172022年8月14日100232022年8月15日100312022年8月14日100432022年8月14日100572022年8月14日

这是我正在使用的查询。我们如何运行查询来给出正确的期望结果(即当它更改为当前 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 查询以获取所需的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73562584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com