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