编号重复的行组-数字组

时间:2019-12-06 07:20:43

标签: sql sql-server

我有一个表格,其中有一列显示1到7重复的数字。

EDRImportID FileID  value           colnum      rn
2           752454  PN                  1       1
2           752454  NNN                 2       2
2           752454  NNNN                3       3 
2           752454  01/01/2019 00:00    4       4
2           752454  0                   5       5
2           752454  01/01/2019 00:30    6       6
2           752454  0                   7       7
2           752454  NNN                 1       8
2           752454  NNNN                2       9
2           752454  SHOS-1              3       10
2           752454  01/01/2019 00:30    4       11
2           752454  0                   5       12
2           752454  01/01/2019 01:00    6       13
2           752454  0                   7       14
2           752454  NNN                 1       15
2           752454  NNNN                2       16

所以我想将第1行第7行分配给GroupNumber 1,将第8行到第14行分配给GroupNumber 2,依此类推。

该表来自表中包含的csv字符串,并将始终具有7行。这是生成表的SQL。

SELECT 
    I.EDRImportID,
    FileID,
    value,
    ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as colnum,
    ROW_NUMBER() OVER(PARTITION BY FileID ORDER BY (SELECT NULL)) as rn
FROM Base.Genesis_ImportFile I
    CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
WHERE I.FileType = 'PN'
AND I.Record like 'PN%'
AND I.EDRImportID = 2
AND FileID = 752454

一旦有了组号,我需要将每个组的7行透视为7列。我尝试了下面的代码,但是它使用了MAX聚合,它将仅返回7列的一行,而不是几行

WITH PNColumns AS
(
    SELECT 
        I.EDRImportID,
        FileID,
        value,
        ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as rn
    FROM Base.Genesis_ImportFile I
        CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
    WHERE I.FileType = 'PN'
    AND I.Record like 'PN%'
    AND I.EDRImportID = 2
    AND FileID = 752454
)

SELECT 
    EDRImportID,
    FileID,
    [2] AS Station,
    [3] AS Unit,
    [4] AS FromDate,
    [5] AS FromMW,
    [6] AS ToDate,
    [7] AS ToMW
FROM PNColumns 
PIVOT(
    MAX(value)
    FOR rn IN ([2],[3],[4],[5],[6],[7])  
) as PVT

1 个答案:

答案 0 :(得分:1)

您应将ROW_NUMBER()CEILING一起使用

CEILING(CAST(ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS DECIMAL)/7) AS Group

SAMPLE FIDDLE DEMO

查询将类似于

SELECT 
    I.EDRImportID,
    FileID,
    value,
    ROW_NUMBER() OVER(PARTITION BY Record,FileID ORDER BY (SELECT NULL)) as colnum,
    CEILING(CAST(ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) AS DECIMAL)/7) AS Group
FROM Base.Genesis_ImportFile I
    CROSS APPLY STRING_SPLIT(Record, ',') AS Cols
WHERE I.FileType = 'PN'
AND I.Record like 'PN%'
AND I.EDRImportID = 2
AND FileID = 752454

输出将

EDRImportID FileID  value           colnum      rn
2           752454  PN                  1       1
2           752454  NNN                 2       1
2           752454  NNNN                3       1 
2           752454  01/01/2019 00:00    4       1
2           752454  0                   5       1
2           752454  01/01/2019 00:30    6       1
2           752454  0                   7       1
2           752454  NNN                 1       2
2           752454  NNNN                2       2
2           752454  SHOS-1              3       2
2           752454  01/01/2019 00:30    4       2
2           752454  0                   5       2
2           752454  01/01/2019 01:00    6       2
2           752454  0                   7       2
2           752454  NNN                 1       3
2           752454  NNNN                2       3