【问题标题】:How to get min value at max date in sql?如何在sql中的最大日期获取最小值?
【发布时间】:2022-02-23 00:17:03
【问题描述】:

我有一张包含快照数据的表。它有 productid 和 date 和数量列。我需要在最大日期中找到最小值。假设我们有产品 X:X 在 Y 日期有最后一个快照,但它在 Y 有两个快照,数量值分别为 9 和 8。我需要得到

product_id | date | quantity
     X        Y       8

到目前为止,我想出了这个。

select 
  productid
  , max(snapshot_date) max_date
  , min(quantity) min_quantity
from snapshot_table
group by 1

它有效,但我不知道为什么。为什么这不会为每个日期带来最小值?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    我会在这里使用RANK 和一个标量子查询:

    WITH cte AS (
        SELECT *, RANK() OVER (ORDER BY quantity) rnk
        FROM snapshot_table
        WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM snapshot_table)
    )
    
    SELECT productid, snapshot_date, quantity
    FROM cte
    WHERE rnk = 1;
    

    请注意,此解决方案迎合了两条或多条记录碰巧绑定在一起的可能性,因为这些记录中的最新记录数量较少。

    编辑:我们可以通过取消 CTE 并使用 QUALIFY 子句来限制 RANK 来简化:

    SELECT productid, snapshot_date, quantity
    FROM snapshot_table
    WHERE snapshot_date = (SELECT MAX(snapshot_date) FROM snapshot_table)
    QUALIFY RANK() OVER (ORDER BY quantity) = 1;
    

    【讨论】:

    • 考虑到这个和其他使用 CTE 的答案,请考虑包含 QUALIFY 子句。可以在此处找到相关文档:cloud.google.com/bigquery/docs/reference/standard-sql/…
    • @DanielZagales 不错的建议。大多数数据库没有QUALIFY(BigQuery 和 Teradata 是两个例外)。我已经编辑了我的答案。
    【解决方案2】:

    考虑下面的方法

    select distinct product_id, 
      max(snapshot_date) over product as max_date,
      first_value(quantity) over(product order by snapshot_date desc, quantity) as min_quantity
    from your_table
    window product as (partition by product_id)
    

    【讨论】:

      【解决方案3】:

      使用 row_number()

        with cte as (select *, 
        row_number() over(partition by product_id order by date desc) rn 
       from table_name) select * from cte where rn=1
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 2020-03-28
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2021-05-30
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        相关资源
        最近更新 更多