【问题标题】:How do I query the value at the start of each week?如何查询每周开始时的值?
【发布时间】:2019-05-05 10:35:50
【问题描述】:

我正在尝试运行一个查询,该查询返回每个日历周开始时的库存水平。更具体地说,我想找到每个日历周开始之前的最后一个事件。

SELECT *
FROM (
  SELECT *, rank() OVER (PARTITION BY sku, warehouse
                    ORDER BY timestamp DESC) AS rnk
  FROM inventory_value
  WHERE timestamp < CAST('2018-11-01' as DATE)
) WHERE rnk = 1

查询应该是这样的,除了我希望它是在开始日期之后的每个星期。

示例输入数据如下所示

    sku         warehouse   timestamp               SOH
1   12345678    W31         2018-09-25 14:00:00.000 2322
2   12345678    W31         2018-11-16 00:00:00.000 0

并且在每周开始时,我想返回它之前的行。

例如,对于 11 月 16 日之前的每个星期,我希望它在 9 月返回活动,但 11 月 16 日之后的所有星期,我希望从 16 日开始获取活动。

我很高兴为查询提供开始日期,但对于我的应用程序,我无法每周修改查询。

提前致谢

【问题讨论】:

  • oyu 能否提供示例数据,您的查询似乎很好
  • 我会尝试准备一些数据。查询工作正常,除了我不想硬编码日期。我希望它每周返回一次。

标签: sql amazon-athena presto


【解决方案1】:

看看它是否有效:

SELECT *
FROM (
  SELECT *, rank() OVER (PARTITION BY sku,warehouse, to_char(trunc(timestamp) - 7/24,'IW'),
                    ORDER BY timestamp DESC) AS rnk
  FROM inventory_value
  WHERE timestamp < (select MAX(timestamp ) from inventory_value)
) WHERE rnk = 1

【讨论】:

    【解决方案2】:

    这是一种方法。

    从您的原始查询中,您可以选择按 date_trunc(week,timestamp) 对记录进行分区,然后对时间戳字段进行排序

    SELECT *
     FROM (
          SELECT *
                 ,rank() OVER (PARTITION BY sku
                                           ,warehouse
                                           ,date_trunc('week',timestamp)
                                   ORDER BY timestamp DESC) AS rnk
            FROM inventory_value      
          )x
    WHERE x.rnk = 1
    

    【讨论】:

    • 对不起这里的初学者,但是我可以从哪里获得周值,因为它不是inventory_value表的一部分
    • 我猜星期应该用单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多