使用 LAG() 和 PARTITION BY 在日期的 10 天内返回行

猴子在Arock

我有下表称为fruits

id  fruit_bought   quantity   date
1 | orange       | 100      | 2018-01-10
2 | apple        | 50       | 2018-02-05
3 | orange       | 75       | 2018-03-07
4 | orange       | 200      | 2018-03-15
5 | apple        | 10       | 2018-03-17
6 | orange       | 20       | 2018-03-20

我想返回有行fruit_boughtorange ,如果在过去10天内的任何时间任何橘子被买了,开始日期2018年3月20日(一行id6)。

例如:

  • 从 开始2018-03-20,在此日期购买了橙子(行id 6
  • 在此之前 10 天是否有任何橙色购买?是:在“2018-03-15”(行id 4
  • 从该日期起 10 天前是否有任何橙色购买?是:在“2018-03-07”(行id 3
  • 从该日期起 10 天前是否有任何橙色购买?不。

最后,我尝试创建的查询将返回id3、4 和 6(但不是 1)的行。

到目前为止,我的查询如下:

SELECT *, LAG(date, 1) OVER (PARTITION BY fruit_bought) FROM fruits
WHERE fruit_bought = 'orange';

这将返回is 的每一添加一个额外的列。fruit_boughtorangelag

忘了它

这个答案基于Gordon Linoff 的想法,但有一些调整:

  • FILTER 没有在 Postgresql 11(目前)中像 Lead() 或 lag() 这样的纯窗口函数实现所以WHERE fruit_bought='orange'用作整个内部 SELECT 的条件。

  • 要保证选择具有最后日期的行,请使用LEAD(date, 1, '-infinity'). 这使得默认值next_date等于-infinity时间戳。因此date >= next_date - interval '10 day'最后日期为 TRUE。

  • 让我们将 10 天内的行称为集群。要仅从最后一个集群中选择行,请计算一个累积总和,计算condFALSE 的次数(因为 FALSE 值将集群分开):

    SUM(CASE WHEN cond IS TRUE THEN 0 ELSE 1 END) OVER (ORDER BY date DESC) AS cluster_num
    

    并仅选择 cluster_num 等于 0 的行。由于我们ORDER BY date DESC,第 0 个集群是最后一个集群。


SELECT *
FROM (
    SELECT *, SUM(CASE WHEN cond IS TRUE THEN 0 ELSE 1 END) OVER (ORDER BY date DESC) AS cluster_num
    FROM (
        SELECT *, date >= next_date - interval '10 day' AS cond
        FROM (
            SELECT id, fruit_bought, date, 
                LEAD(date, 1, '-infinity') 
                OVER (PARTITION BY fruit_bought ORDER BY date) AS next_date 
            FROM fruits 
            WHERE fruit_bought='orange'
            -- restrict date here to specify an "initial date"
            AND date <= '2018-04-01'  
        ) t1
    ) t2
) t3
WHERE cond AND cluster_num = 0
ORDER BY date ASC

产量

| id | fruit_bought |       date |  next_date | cond | cluster_num |
|----+--------------+------------+------------+------+-------------|
|  3 | orange       | 2018-03-07 | 2018-03-15 | t    |           0 |
|  4 | orange       | 2018-03-15 | 2018-03-20 | t    |           0 |
|  6 | orange       | 2018-03-20 |  -infinity | t    |           0 |

设置:

CREATE TABLE fruits (
    fruitid INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    id INT,
    fruit_bought TEXT,
    quantity INT,
    date DATE);

INSERT INTO fruits (id, fruit_bought, quantity, date)
VALUES (1,'orange',100,'2018-01-10')
, (2,'apple',50,'2018-02-05')
, (3,'orange',75,'2018-03-07')
, (4,'orange',200,'2018-03-15')
, (5,'apple',10,'2018-03-17')
, (6,'orange',20,'2018-03-20')
, (7,'orange',20,'2018-01-09');

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当值!= LAG(值)时,选择日期时间和值

来自分类Dev

在 T-SQL 中使用 Over 和 Partition by 时 Min() 上缺少日期

来自分类Dev

使用开始和结束日期按日期范围扩展行

来自分类Dev

使用ROW_NUMBER和PARTITION BY获取第一行和最后一行

来自分类Dev

使用ROW_NUMBER和PARTITION BY获取第一行和最后一行

来自分类Dev

在SQL中使用LAG跳过特定的行

来自分类Dev

SQL Server:在日期的X天内返回记录

来自分类Dev

如何在哪里使用LEAD和LAG?

来自分类Dev

tidymodel配方和step_lag():使用predict()时出错

来自分类Dev

在R中使用lag和mutate命令创建迭代函数

来自分类Dev

在Java中使用日期和仅日期

来自分类Dev

LAG函数和NULL

来自分类Dev

使用Entity Framework 6属性,存储行创建日期和上次更新日期

来自分类Dev

使用ksh从行中解析名称和日期,如果日期早于50天,则删除该行

来自分类Dev

使用Think Sphinx和日期

来自分类Dev

使用日期和时间功能

来自分类Dev

如何使用Incron和日期?

来自分类Dev

MySQL-返回行,当前日期在开始日期和结束日期之间

来自分类Dev

日期对象和ISO日期对象返回不同的日期

来自分类Dev

如何使用PowerShell仅为Created by和Created Date列返回一个用户和日期

来自分类Dev

查找每一行的日期范围。LEAD / LAG,但具有不同的类型/动作

来自分类Dev

使用row_partition内的过滤器进行过滤和排序(使用row_partition)

来自分类Dev

使用带日期的pdo prepare和UNION不返回任何结果(mysql)

来自分类Dev

使用API返回哪种日期和时间格式最有趣

来自分类Dev

如何在不规则的时间和日期使用 Quartz 安排作业,例如 5 月 22 日上午 8:10 和 6 月 30 日下午 6:00

来自分类Dev

查询以比较带日期的日期和不带日期的日期-使用Access DB的python

来自分类Dev

如何使用LINQ比较日期和日期时间?

来自分类Dev

使用R替换日期中缺少的日期和月份

来自分类Dev

使用awk和日期获取当前日期

Related 相关文章

  1. 1

    当值!= LAG(值)时,选择日期时间和值

  2. 2

    在 T-SQL 中使用 Over 和 Partition by 时 Min() 上缺少日期

  3. 3

    使用开始和结束日期按日期范围扩展行

  4. 4

    使用ROW_NUMBER和PARTITION BY获取第一行和最后一行

  5. 5

    使用ROW_NUMBER和PARTITION BY获取第一行和最后一行

  6. 6

    在SQL中使用LAG跳过特定的行

  7. 7

    SQL Server:在日期的X天内返回记录

  8. 8

    如何在哪里使用LEAD和LAG?

  9. 9

    tidymodel配方和step_lag():使用predict()时出错

  10. 10

    在R中使用lag和mutate命令创建迭代函数

  11. 11

    在Java中使用日期和仅日期

  12. 12

    LAG函数和NULL

  13. 13

    使用Entity Framework 6属性,存储行创建日期和上次更新日期

  14. 14

    使用ksh从行中解析名称和日期,如果日期早于50天,则删除该行

  15. 15

    使用Think Sphinx和日期

  16. 16

    使用日期和时间功能

  17. 17

    如何使用Incron和日期?

  18. 18

    MySQL-返回行,当前日期在开始日期和结束日期之间

  19. 19

    日期对象和ISO日期对象返回不同的日期

  20. 20

    如何使用PowerShell仅为Created by和Created Date列返回一个用户和日期

  21. 21

    查找每一行的日期范围。LEAD / LAG,但具有不同的类型/动作

  22. 22

    使用row_partition内的过滤器进行过滤和排序(使用row_partition)

  23. 23

    使用带日期的pdo prepare和UNION不返回任何结果(mysql)

  24. 24

    使用API返回哪种日期和时间格式最有趣

  25. 25

    如何在不规则的时间和日期使用 Quartz 安排作业,例如 5 月 22 日上午 8:10 和 6 月 30 日下午 6:00

  26. 26

    查询以比较带日期的日期和不带日期的日期-使用Access DB的python

  27. 27

    如何使用LINQ比较日期和日期时间?

  28. 28

    使用R替换日期中缺少的日期和月份

  29. 29

    使用awk和日期获取当前日期

热门标签

归档