簡體   English   中英

給定以下數據,編寫查詢以生成表的最佳方法是什么?

[英]What would be the best way to write a query to produce a table given the following data?

我有一個包含以下數據的表:

  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 實現這一目標的最佳方法是什么? 如果可以,請提供查詢示例,非常感謝。

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);

這是演示

對於您的示例數據,這將起作用:

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 

請參閱演示
結果:

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

似乎您需要做的是在這里標准化您的數據。 在這里,我使用PARSENAME獲取“列號”,然后使用ROW_NUMBER對組中的相關行進行編號。 最后我使用交叉表到 Pivot 到數據:

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;
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM