检查数字是否在算术级数中

时间:2018-12-26 09:45:23

标签: sql sql-server tsql

我有一个表,其中有一个Order列,在相同的parentId下,Order列始终按10的顺序增加,即10、20、30、40....。

父级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,父ID是自引用fk。

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

2 个答案:

答案 0 :(得分:3)

您可以使用窗口功能:

-- 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<>fiddle demo

答案 1 :(得分:0)

基于数据库结构,当Parent为NULL和Parent为非NULL时,我不得不处理两种情况

我使用了@Lukasz Szozda建议的代码,并将其稍加更改以在我的案例中包含一个容器,然后将其分区为null

WITH cte AS (
  SELECT *, 
   FIRST_VALUE(OrderColumn) OVER(PARTITION BY DocumentId,Parent ORDER BY OrderColumn) +
   10*(ROW_NUMBER() OVER(PARTITION BY DocumentId,Parent ORDER BY OrderColumn)-1) AS ExpectedDisplayOrder
  FROM DocumentData
)
SELECT *
FROM cte
WHERE ExpectedDisplayOrder != OrderColumn;

检查以下小提琴以获得完整摘录 https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=5c54edd62fff160e94139faa3c8b92c9