首页 > 解决方案 > 检查数字是否在算术级数中

问题描述

我有一个表,其中有一列 Order,Order 列总是按 10 的顺序增加,即 10,20,30,40 ..... 在同一个 parentId 下

即父 1 的订单列是 10,20,30,40 父 2 的订单列可以是 10,20

我所知道的是我必须使用一个运行类似于 n(R1+Rn)/2 https://www.tiger-algebra.com/drill/10,20,30,40,50,60,70 的逻辑, 80,90,100/

数据库结构如https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=9557181f0c559131fa25bc5918b84bd4中解释的那样 可以有多个 DocumentId 每个 documentId 包含一堆 DocumentData

这里 DocumentDataId 是 pk,一个 Parent Id 是一个自引用的 fk。

我要检查的是确保订单始终按顺序排列,即 10、20、30、40 并且没有重复或像 10、20、20、40 这样的空白我将如何在 SQL Server 中运行它?

标签: sqlsql-servertsql

解决方案


您可以使用窗口函数:

-- incorrect values
WITH cte AS (
  SELECT *, 
   FIRST_VALUE(OrderColumn) OVER(PARTITION BY Parent ORDER BY OrderColumn) +
   10*(ROW_NUMBER() OVER(PARTITION BY Parent ORDER BY OrderColumn)-1) AS progression
  FROM tab
)
SELECT *
FROM cte
WHERE progression != OrderColumn;

-- correct
WITH cte AS (
  SELECT *, 
   FIRST_VALUE(OrderColumn) OVER(PARTITION BY Parent ORDER BY OrderColumn) +
   10*(ROW_NUMBER() OVER(PARTITION BY Parent ORDER BY OrderColumn)-1) AS progression
  FROM tab
)
SELECT Parent
FROM cte
EXCEPT
SELECT Parent
FROM cte
WHERE progression != OrderColumn
GROUP BY Parent;

db<>小提琴演示


推荐阅读