0

这应该很容易,但我陷入了困境。

它像图像一样简单,但是我有一个名为“类别”的列,一旦该行有一个类别,我希望这个值在一个新列中重复 'n' 次,比如说 10 次(或我想要的任何值) .

我尝试使用FIRST_VALUE(),但没有关于何时出现此类别的模式,因此大多数时候我将“null”作为重复。

我见过ROW_NUMBER() OVER(PRECEDING AND FOLLOWING),但我不能在其中使用字符串,只是一个聚合,我不想计算,我想分类。我什至尝试使用CASE WHEN xxx category * 10 等,category + 10但当然不起作用。

有什么建议吗?谢谢!

我试过的:

WITH table1 AS( 

SELECT
date,
hour,
minute,
category, 
ROW_NUMBER() OVER() AS rn
FROM table1),

table2 AS(
SELECT
*,
  CASE 
  WHEN category IS NOT NULL THEN 1
  ELSE 0
  END AS flag_category
FROM table1)

SELECT
*,
  CASE 
  WHEN flag_category = 1
  THEN (SELECT 
        a.category,
        FROM table2 AS a
        INNER JOIN table2 AS b
        ON a.rn = b.rn + 10)
  ELSE '-'
  END AS category_repetition

FROM table2

图片说明在这里

W   H   A   T      I     H  A   V  E    WHAT     I     WANT
date       hour minute  qty category    category_repetition
20210412    0    0       2  null              null
20210412    0    1       0  null              null
20210412    0    2       6  null              null
20210412    0    3       7  null              null
20210412    0    4       7  null              null
20210412    0    5       6  null              null  
20210412    0    6       3  null              null
20210412    0    7       8  null              null
20210412    0    8       4  null              null
20210412    0    9       3  category A      category A
20210412    0   10       4  null            category A
20210412    0   11       0  null            category A
20210412    0   12       5  null            category A
20210412    0   13       2  null            category A
20210412    0   14       3  null            category A
20210412    0   15       3  null            category A
20210412    0   16       4  null            category A
20210412    0   17       3  null            category A
20210412    0   18       5  null            category A
20210412    0   19       4  null            category A


4

1 回答 1

1

你似乎想要last_value(ignore nulls)

select t.*,
       last_value(category ignore nulls) over (order by date, hour, minute) as category_repetition
from t;

我不确定问题中的“10”是什么意思。这应该会根据样本数据和结果生成您想要的数据。

于 2021-05-21T00:19:29.757 回答