gpt4 book ai didi

sql - HiveQL-窗口上多个列的first_value

转载 作者:行者123 更新时间:2023-12-02 19:54:13 24 4
gpt4 key购买 nike

我正在寻找HiveQL窗口中的第一行和最后一行。
我知道有几种方法可以做到这一点:

  • 在我感兴趣的列上使用 FIRST_VALUE LAST_VALUE
  • SELECT customer,
    FIRST_VALUE(product) over (W),
    FIRST_VALUE(time) over (W),
    LAST_VALUE(product) over (W),
    LAST_VALUE(time) over (W)
    FROM table
    WINDOW W AS (PARTITION BY customer ORDER BY COST)
  • 计算每行的 ROW_NUMBER(),并为row_number = 1使用where子句。
  • WITH table_wRN AS  
    (
    SELECT *,
    row_number() over (partition by customer order by cost ASC) rn_B,
    row_number() over (partition by customer order by cost DESC) rn_E
    FROM table
    ),
    table_first_last AS
    (
    SELECT *
    FROM table_wRN
    WHERE (rn_E=1 OR rn_B=1)
    )

    SELECT table_first.customer,
    table_first.product, table_first.time,
    table_last.product, table_last.time
    FROM table_first_last as table_first WHERE table_first_last.rn_B=1
    JOIN table_first_last as table_last WHERE table_first_last.rn_E=1
    ON table_first.customer = table_last.customer

    我的问题:
  • 有谁知道这两个中哪个更有效?

    凭直觉,我认为第一个应该更快,因为不需要子查询或CTE。
  • 实验上,我觉得第二个更快,但这可能是因为我在许多列上运行first_value。
  • 是否有一种方法可以一次应用first_value并检索多列。
  • 我希望减少开窗/评估窗口的次数(类似于缓存窗口)
  • 伪代码示例:
  • FIRST_VALUE(product,time) OVER (W) AS product_first, time_first

  • 谢谢!

    最佳答案

    我几乎可以肯定,第一个会更有效率。我的意思是两个窗口函数与两个窗口函数,过滤和两个联接?

    乘以列数后,可能会出现一个更快的问题。就是说,看看执行计划。我希望所有使用相同窗口框架规范的窗口函数都将使用相同的“窗口”处理,并对每个值进行微调。

    Hive对复杂数据类型(例如字符串和数组)没有很好的支持。在这样做的数据库中,提供一个复杂的类型很容易。

    关于sql - HiveQL-窗口上多个列的first_value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60624127/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com