sql - 使用 SQL 查询根据连续值更新最小值

标签 sql sql-server t-sql

尝试将最小 CardSerial 更新到 MinimumCardSerial 列中。下面是我的表结构。

CardID      CardSerial       Denomination Minimumcardserial
----------- ---------------  ------------ -----------------
2685680     214026002        10           
2685681     214026003        10           
2685682     214026004        10           
2685778     214026100        10           
2685779     214026101        10           
2685780     214026102        10           
2685878     214026200        10           
2685879     214026201        10           
2685880     214026202        10           

预期结果如下

CardID      CardSerial       Minimumcardserial
----------- ---------------- ----------- ------------ -------------
2685680     214026002        214026002
2685681     214026003        214026002
2685682     214026004        214026002
2685778     214026100        214026100
2685779     214026101        214026100
2685780     214026102        214026100
2685878     214026200        214026200
2685879     214026201        214026200
2685880     214026202        214026200

下面的查询对于基于连续组查找最小卡片序列很有用,但是尝试查找更新查询以将最小卡片序列更新到源表本身中。请有人帮忙。

WITH
  sequenced AS 
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY Denomination ORDER BY cardSerial) AS sequence_id,
    *   FROM  Cards )

SELECT
  min(cardSerial),  Denomination
FROM   Sequenced
GROUP BY
  Denomination, 
  cardSerial - sequence_id
ORDER BY
  Denomination, 
  cardSerial - sequence_id

最佳答案

这是一种间隙和岛屿问题。假设 cardserial 是一个数字,您可以减去一个枚举值 - 并且该差对于递增的值是恒定的。

然后只取该分组中的最小值:

select c.*,
       min(cardserial) over (partition by cardserial - seqnum) as minimum_cardserial
from (select c.*,
             row_number() over (order by cardserial) as seqnum
      from cards c
     ) c;

如果cardserial不是数字,您可以直接转换为数字:

min(cardserial) over (partition by convert(numeric(38), cardserial)) - seqnum)

关于sql - 使用 SQL 查询根据连续值更新最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68058399/

相关文章:

Java - 循环遍历数据库记录的有效方法

sql - 在sql中对表进行简单的统计

sql-server-2008 - SQL Server 2008 编译的 TSQL 性能

python - MySQL - 匹配两个包含巨大数据的表并找到相似的数据

c# - 为什么 SCOPE_IDENTITY() 返回 -1?

sql-server - 使用其他表中的随机值更新 SQL 表

sql - 使用 SQL Server 生成随 secret 钥

sql - 如何找到一个不存在的数字?

sql - 对于简单值的键值对,关系型数据库不就不如Redis这样的No-SQL数据库吗?

.net - 从 .NET 应用程序执行 SQL Server 脚本的最佳实践?