如何在tsql中使用特殊的while循环,同时使用数字

时间:2017-04-17 19:40:16

标签: sql sql-server tsql while-loop azure-sql-database

我通过Azure数据工厂加载一些非常讨厌的数据

这是加载后数据的外观,分为两部分:
1.测试的元数据
2.测试的实际测量 - >测量是数字

图片我有大约10次这样的'包裹' 1.Metadata + 2.Measurements

enter image description here

我希望它/我正在寻找的是以下内容: 带有1,2,....的数字列是我正在寻找的!

enter image description here

想象一下,我的屏幕截图不会再进一步​​,但这一直持续到id = 10 我想这里需要一个while循环...

之前的查询:

SELECT Field1 FROM Input

查询后:

SELECT GeneratedId, Field1 FROM Input

提前多多感谢!

编辑:添加了一个提示: enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个解决方案,这需要SQL-SERVER 2012或更高版本。

首先在您的数据上获取Id列。如果你可以在脚本之前执行更好的操作,但如果没有,请尝试这样的事情......

CREATE TABLE #InputTable (
    Id INT IDENTITY(1, 1),
    TestData NVARCHAR(MAX) )

INSERT INTO #InputTable (TestData)
SELECT Field1 FROM Input

现在创建一个查询以获取每个包的GeneratedId以及它们开始和结束的Id。您可以通过获取所有记录LIKE 'title%'来执行此操作,因为这是每个包的第一条记录,然后使用ROW_NUMBERIdLEAD作为GeneratedId分别是},StartIdEndId

SELECT
    GeneratedId = ROW_NUMBER() OVER(ORDER BY (Id)),
    StartId = Id,
    EndId = LEAD(Id) OVER (ORDER BY (Id))
FROM #InputTable
WHERE TestData LIKE 'title%'

最后,将此连接到输入以获取所有记录,并使用正确的GeneratedId

SELECT
    package.GeneratedId, i.TestData
FROM (
    SELECT
        GeneratedId = ROW_NUMBER() OVER(ORDER BY (Id)),
        StartId = Id,
        EndId = LEAD(Id) OVER (ORDER BY (Id))
    FROM #InputTable
    WHERE TestData LIKE 'title%' ) package
INNER JOIN #InputTable i 
    ON i.Id >= package.StartId 
    AND (package.EndId IS NULL OR i.Id < package.EndId)