给定以下数据,编写查询以生成表的最佳方法是什么?

问题描述 投票:-1回答:4

我有一个包含以下数据的表:

  ADD_Col         Data      OrderId     Output     NEW_ADD        Col1       Col2
  -----          ------   -------      ----->       -------     --------   -------
     AD*A*1      A       96                           A           1          2
     AD*A*1      B       95                           B           1          1
     AD*A*1      C       94                           C           0.8        1
     AD*A*1      D       93                           D           5          2
     AD*A*2      1       92 
     AD*A*2      1       91
     AD*A*2      0.8     90
     AD*A*2      5       89
     AD*A*3      2       88
     AD*A*3      1       87
     AD*A*3      1       86
     AD*A*3      2       85

此数据都在同一张表中,我需要将每个字母链接到每个因素。我当时想做一个ROW_NUMBER()并根据各自的行号加入,并给我的字母分配相同的编号,即DENSERANK。实现这一目标的最佳方法是什么?如果可以的话,请提供查询示例,非常感谢。

sql sql-server join row-number
4个回答
1
投票

似乎您需要做的是在这里标准化您的数据。在这里,我使用PARSENAME获取“列号”,然后使用ROW_NUMBER对组中的相关行进行编号。最后,我使用“交叉”选项卡来透视数据:

WITH CTE AS(
    SELECT V.[Key],
           V.data,
           V.[Order],
           PARSENAME(REPLACE(V.[Key],'*','.'),1) AS ColNo,
           ROW_NUMBER() OVER (PARTITION BY V.[Key] ORDER BY V.[Order] DESC) AS RN
    FROM (VALUES('AD*A*1','A',96),       
                ('AD*A*1','B',95),       
                ('AD*A*1','C',94),       
                ('AD*A*1','D',93),       
                ('AD*A*2','1',92),
                ('AD*A*2','1',91),
                ('AD*A*2','0.8',90),
                ('AD*A*2','5',89),
                ('AD*A*3','2',88),
                ('AD*A*3','1',87),
                ('AD*A*3','1',86),
                ('AD*A*3','2',85))V([Key],[data],[Order]))
SELECT MAX(CASE C.ColNo WHEN '1' THEN C.[data] END) AS New_ADD,
       MAX(CASE C.ColNo WHEN '2' THEN C.[data] END) AS Col1,
       MAX(CASE C.ColNo WHEN '3' THEN C.[data] END) AS Col2
FROM CTE C
GROUP BY C.RN;

1
投票

对于您的示例数据,它将起作用:

with cte as (
  select *, 
    row_number() over (partition by [key] order by [OrderId desc]) rn,
    dense_rank() over (order by [key]) rk
  from tablename
)  
select t1.data, 
  max(case when t2.rk = 2 then t2.data end) col1,
  max(case when t2.rk = 3 then t2.data end) col2
from (select * from cte where rk = 1) t1
inner join (select * from cte where rk in (2, 3)) t2
on t2.rn = t1.rn
group by t1.data 

请参见demo。结果:

> data | col1 | col2
> :--- | :--- | :---
> A    | 1    | 2   
> B    | 1    | 1   
> C    | 0.8  | 1   
> D    | 5    | 2   

1
投票
select t1.Data "Key"
       , t2.Data "Col1"
       , t3.Data "Col2" 
from ((SELECT Data, 
              row_number() over (order by Key_C) rn
       from my_table 
       where Key_C = 'AD*A*1') t1
       left join
      (SELECT Data,
              row_number() over (order by Key_C) rn
       from my_table
       where Key_C = 'AD*A*2') t2
       on t1.rn = t2.rn
       left join
      (SELECT Data,
              row_number() over (order by Key_C) rn
       from my_table
       where Key_C = 'AD*A*3') t3
       on t2.rn = t3.rn);

这里是DEMO


1
投票
DROP TABLE IF EXISTS #RawData
SELECT 
    [ADD_Col]
    ,[Data]
    ,[OrderId]
    ,REPLACE([ADD_Col], 'AD*A*', '') AS [Level]
    ,DENSE_RANK() OVER (PARTITION BY [ADD_Col] ORDER BY [OrderId] DESC) AS [Grouping]
INTO
    #RawData
FROM 
    [SourceTable]

SELECT
    rd.[Data]
    ,rdc1.[Data] AS [Col1]
    ,rdc2.[Data] AS [Col2]
FROM
    #RawData AS rd
    LEFT OUTER JOIN #RawData AS rdc1
        ON rdc1.[Level] = 2
        AND rd.[Grouping] = rdc1.[Grouping]
    LEFT OUTER JOIN #RawData AS rdc2
        ON rdc2.[Level] = 3
        AND rd.[Grouping] = rdc2.[Grouping]
WHERE
    rd.[Level] = 1
© www.soinside.com 2019 - 2024. All rights reserved.