使用窗口函数根据另一列从列中检索值
Posted
技术标签:
【中文标题】使用窗口函数根据另一列从列中检索值【英文标题】:Using window function to retrieve values from a column depending on another 【发布时间】:2020-08-14 20:40:21 【问题描述】:在如下数据框中:
id date product
1 2010-02-01 c
1 2010-02-02 v
1 2010-02-03 d
1 2010-02-04 g
2 2010-02-03 h
2 2010-02-04 w
2 2010-02-05 t
2 2010-02-06 d
3 2010-02-04 x
3 2010-02-05 f
3 2010-02-06 x
我想添加另一列,给出用户在最短日期使用的产品。所以它需要像下面这样:
id date product early_product
1 2010-02-01 c c
1 2010-02-02 v c
1 2010-02-03 d c
1 2010-02-04 g c
2 2010-02-03 h h
2 2010-02-04 w h
2 2010-02-05 t h
2 2010-02-06 d h
3 2010-02-04 x x
3 2010-02-05 f x
3 2010-02-06 x x
我知道我需要使用窗口功能并从下面的那个开始。但这将为我提供每个用户的最早日期。我需要为用户找到最早使用的产品:
min(date) over (partition by id) as earliest_date
【问题讨论】:
你不是已经问过同样的问题了吗? 我做了,但有人将它标记为重复,尽管它不是。 那是我,我又做了一次。您需要日期最短的行中的产品。另一个问题解释了如何按用户获取该行。 但是我想用一个窗口函数来解决它以用于学习目的,而且我的实际查询比这个大得多,所以使用这种方式效率不高。 另一个问题有使用窗口函数的答案。 【参考方案1】:使用 FIRST_VALUE 作为窗口函数
CREATE TABLE table1 ( `id` INTEGER, `date` Date, `product` VARCHAR(1) ); INSERT INTO table1 (`id`, `date`, `product`) VALUES ('1', '2010-02-01', 'c'), ('1', '2010-02-02', 'v'), ('1', '2010-02-03', 'd'), ('1', '2010-02-04', 'g'), ('2', '2010-02-03', 'h'), ('2', '2010-02-04', 'w'), ('2', '2010-02-05', 't'), ('2', '2010-02-06', 'd'), ('3', '2010-02-04', 'x'), ('3', '2010-02-05', 'f'), ('3', '2010-02-06', 'x');
编号 |日期 |产品 |最小产品 -: | :--------- | :-------- | :--------- 1 | 2010-02-01 | c | C 1 | 2010-02-02 | v | C 1 | 2010-02-03 | d | C 1 | 2010-02-04 |克 | C 2 | 2010-02-03 | h | H 2 | 2010-02-04 | w | H 2 | 2010-02-05 |吨 | H 2 | 2010-02-06 | d | H 3 | 2010-02-04 | x | X 3 | 2010-02-05 | f | X 3 | 2010-02-06 | x | XSELECT `id`, `date`, `product` , FIRST_VALUE(`product`) OVER(PARTITION BY `id` ORDER BY `date` ROWS UNBOUNDED PRECEDING) minproduct FROM table1
db小提琴here
【讨论】:
感谢您的回答。我收到此错误:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句; lokks 喜欢你使用 aws 我改变了我的答案以上是关于使用窗口函数根据另一列从列中检索值的主要内容,如果未能解决你的问题,请参考以下文章