-2

我在 SQL 中有一个数据透视表,我想分别对表的每一列执行相同的计算。我如何做到这一点。说,表有 columnA,columnB,columnc,columnD 我想从所有列中获取第 10 个最大值并将它们放在一个表中。我如何实现它?

我想为所有策略找到第 10 个最小值,然后将这些值存储在具有相同标题的单独表中。

我计算值没有问题。只是对如何将循环中的列传递给函数感到困惑。

样本数据:

策略A 策略B 策略C 战略D 战略E
4473.164519 -832204.0006 25095.16851 8788977.725 506105.7806
-222508.8221 -851761.6503 164218.3626 -4367196.053 -84624.36628
867003.7236 487008.4025 26710.88107 4082241.97 189234.9322
-330435.2971 365190.5616 -10584.46692 4102757.782 299020.0012
-535310.2508 310416.7992 79897.24744 -10953293.61 -564989.8894
-514024.1552 -346664.9571 55618.36525 8522229.45 655242.7607
-436928.7429 -58154.95719 -44987.25771 5425344.541 35985.08909
-6464.566909 -360774.5086 53418.19191 14460736.71 245481.6733
1263647.387 276284.247 71139.91947 -2261400.941 43325.73506
585130.213 175584.3894 48335.7496 8522351.461 -318176.6566
345966.5601 84640.05185 878.7445104 -8279378.739 131650.8008
-1014561.295 -60904.16851 49445.97807 5949547.396 -100504.8712
-296675.3075 -54446.86927 24695.90471 -4290511.847 163124.7882
-393639.2875 -298330.2819 46869.02256 8260696.205 616997.3033
170574.9289 1443.363565 43365.57016 -4090479.985 -137358.3613
6742.101683 15065.29802 12467.78135 -3110231.995 -155413.7505
73421.38876 25301.92932 24400.89382 -1907483.704 217638.5604

预期:具有相同列但每列只有第 10 个最小值的表:

策略A 策略B 策略C 战略D 战略E
-6464.566909 1443.363565 43365.57016 4082241.97 131650.8008
4

2 回答 2

0

您可以通过row_number为每列分配一个,然后使用case expression

with x as (
    Row_Number() over(order by StrategyA) r1, 
    Row_Number() over(order by StrategyB) r2, 
    Row_Number() over(order by StrategyC) r3,
    Row_Number() over(order by StrategyD) r4,
    Row_Number() over(order by StrategyE) r5
    from t
)
select 
    max(case when r1=10 then StrategyA end) StrategyA,
    max(case when r2=10 then StrategyB end) StrategyB,
    max(case when r3=10 then StrategyC end) StrategyC,
    max(case when r4=10 then StrategyD end) StrategyD,
    max(case when r5=10 then StrategyE end) StrategyE
from x
于 2021-05-08T10:42:36.963 回答
0

我不会同时使用窗口功能:

select (select strategyA from t order by strategyA offset 9 row fetch first 1 row only),
       (select strategyB from t order by strategyB offset 9 row fetch first 1 row only),
       (select strategyC from t order by strategyC offset 9 row fetch first 1 row only),
       (select strategyD from t order by strategyD offset 9 row fetch first 1 row only),
       (select strategyE from t order by strategyE offset 9 row fetch first 1 row only)

至于使这种动态化,我会旋转并将值放在单独的行中之前这样做。

select u.*
from (select u.*,
             row_number() over (partition by strategyType order by strategyValue) as seqnum
      from unpivoted u
     ) u
where seqnum = 1;
于 2021-05-08T11:13:40.630 回答