我有一个表,其中有一个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>
答案 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;
答案 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