获取 last_value MariaDB SQL

Getting last_value MariaDB SQL

我在 table 中有此数据:

internal_id match_id company_id market_id selection_id odds_value update_date
1442 8483075 66 1 1 100 2021-01-04 18:58:19
1 8483075 66 1 1 10 2021-01-04 18:57:19
2 8483075 66 1 2 19 2021-01-04 18:57:19
3 8483075 66 1 3 1.08 2021-01-04 18:57:19

对于 match_id + company_id + market_id + [= 的每个组合,我正在尝试从整个 table 中获取 odds_value 的最后一个值28=] 基于 update_date.

我写了这个无效的查询:

SELECT
    odds.`internal_id`,
    odds.`match_id`,
    odds.`company_id`,
    odds.`market_id`,
    odds.`selection_id`,
    odds.`update_date`,
    odds.`odd_value`,
    LAST_VALUE (odds.`odd_value`) OVER (PARTITION BY odds.`internal_id`, odds.`match_id`, odds.`company_id`, odds.`market_id`, odds.`selection_id` ORDER BY odds.`update_date` DESC) AS last_value
FROM
    `odds`
LEFT JOIN `matches` ON matches.match_id = odds.match_id
WHERE
    odds.match_id = 8483075
    and odds.company_id = 66
GROUP BY
    odds.match_id,
    odds.company_id,
    odds.market_id,
    odds.selection_id

对于 match_id=8483075 & market_id=1 和 selection_id=1 我得到 odd_value 10 而不是 100。 我究竟做错了什么?或者也许有更好的方法(使用 internal_id = 更高意味着最近)?

LAST_VALUE()很奇怪。问题是默认的 window 排序框架是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

我不会详细介绍,但解决方法是始终使用 FIRST_VALUE()。我还在修复 PARTITION BY 以匹配您问题中的描述:

FIRST_VALUE(odds.odd_value) OVER (PARTITION BY odds.company_id, odds.market_id, odds.selection_id
                                  ORDER BY odds.update_date DESC
                                 ) AS last_value

具有讽刺意味的是,您已经进行了降序排序,所以您的最后一个值无论如何实际上都是在获取第一个值。