SQLite 窗口函数

标签 sqlite max common-table-expression window-functions min

这是我的数据库的简化 ER 图:

ER diagram

我想要检索的是,对于每个vendor_item:

  • 最高价格(不包括最后一次捕获)
  • 最低价格(不包括最后一次捕获)
  • 当前价格(即最​​后一次捕获)

这是 PRICE_DATA 的一些示例数据表格给你一个想法:

<表类=“s-表”> <标题> vendor_item_id capture_ts 价格 <正文> 124 2022-03-02 09:00:12.851043 46.78 124 2022-03-02 14:07:49.423343 42.99 124 2022-03-04 08:20:07.636140 43.99 124 2022-03-05 08:29:20.421764 42.99 124 2022-03-08 08:33:59.043372 42.99 129 2022-03-02 08:55:14.401816 21.52 129 2022-03-02 14:11:20.544427 25.54 129 2022-03-04 08:24:06.976667 25.72 129 2022-03-08 08:22:46.734662 30.83 132 2022-03-02 09:04:18.144494 41.99 132 2022-03-03 08:29:15.981712 42.99 132 2022-03-04 08:27:39.327779 41.99 132 2022-03-07 08:29:41.236009 42.99 132 2022-03-08 08:27:44.318570 40.99

这是我到目前为止的 SQL 语句:

select distinct vendor_item_id
      ,last_value(price) over win as curr_price
      ,min(price) over win as low_price
      ,max(price) over win as high_price
from price_data
window win as (partition by vendor_item_id 
               order by capture_ts 
               rows between unbounded preceding 
                        and unbounded following);

虽然这或多或少地满足了我的需求,但存在一些问题:

  • 最高和最低价格考虑所有记录,而不是排除最近捕获的记录。

  • 如果我不添加distinct对于查询,我最终得到了重复的记录(这可能是我的错,因为未能正确掌握窗口功能)。

期望的结果:

<表类=“s-表”> <标题> vendor_item_id curr_price low_price high_price <正文> 124 42.99 42.99 46.78 129 30.83 21.52 25.72 132 40.99 41.99 42.99

感谢您的帮助!

最佳答案

使用为每个 vendor_item_id 返回最大 capture_ts 的 CTE,然后根据条件获取 low_pricehigh_price聚合:

WITH cte AS (
  SELECT *, MAX(capture_ts) OVER (PARTITION BY vendor_item_id) max_capture_ts
  FROM price_data
)
SELECT DISTINCT vendor_item_id,
       FIRST_VALUE(price) OVER (PARTITION BY vendor_item_id ORDER BY capture_ts DESC) curr_price,
       MIN(CASE WHEN capture_ts < max_capture_ts THEN price END) OVER (PARTITION BY vendor_item_id) low_price, 
       MAX(CASE WHEN capture_ts < max_capture_ts THEN price END) OVER (PARTITION BY vendor_item_id) high_price
FROM cte;

请参阅demo .

关于SQLite 窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71411033/

相关文章:

android - 后台粘性并发标记清除GC sqlite数据库的无限循环

android - SQLiteConstraintException : error code 19: constraint failed

android - Android 中的绑定(bind)数据

sql - Linq 中的分层数据 - 选项和性能

c - sqlite3_exec 有和没有显式事务

mysql - 比较两个 MySQL 表之间的最高值

php - 使用 MAX 和 GROUP BY 从表中提取数据

c++ - 如何从 vector<std::string> 获取 max_element

sql - SQL/Snowflake中基于两个数据集的条件逻辑

sql - 如何在SQL中实现链