使用窗口函数根据另一列从列中检索值

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');
SELECT `id`, `date`, `product` 
, FIRST_VALUE(`product`) OVER(PARTITION BY `id` ORDER BY `date` ROWS UNBOUNDED PRECEDING) minproduct
FROM table1
编号 |日期 |产品 |最小产品 -: | :--------- | :-------- | :--------- 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 | X

db小提琴here

【讨论】:

感谢您的回答。我收到此错误:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句; lokks 喜欢你使用 aws 我改变了我的答案

以上是关于使用窗口函数根据另一列从列中检索值的主要内容,如果未能解决你的问题,请参考以下文章

根据 Pandas 中另一列中的索引从列中获取数据

当前行和上一行之间具有特定值的窗口函数

基于另一列从一列中删除单词,然后创建并将其放入新列

根据另一列的位置从一组列中返回值

基于另一列的滞后窗口函数

如何计算另一列中特定值的列的平均值?