sql - 有效地查找给定日期之前的多个最近日期?

标签 sql postgresql

以下查询需要1.5s,因为我需要运行它几千次,所以我想优化它。基本上我试图找到小于或等于提供日期数组的第一个日期(例如 ['2016-01-01', '2017-01-01', '2018-01-01'])。现在我正在单独进行每个日期:

SELECT date FROM date_history
     WHERE ticker = 'APPL' AND date <= %(date)
     ORDER BY date DESC LIMIT 1;

我觉得如果我可以在这些行下重用日期排序或其他东西,它可能会更快,但我想不出一个好的方法来做到这一点。我们将不胜感激任何有关如何加快速度的建议!

最佳答案

您可以使用 ROW_NUMBER:

WITH cte(d) AS (
   VALUES ('2016-01-01'::date)
          ,('2017-01-01'::date)
          ,('2018-01-01'::date)
   --Or unnest array_variable WITH ORDINALITY
), cte2 AS (
SELECT d.date, c.d,
   ROW_NUMBER() OVER(PARTITION BY c.d ORDER BY d.date DESC) AS rn
FROM cte c
LEFT JOIN date_history d
  ON d.date <= c.d
WHERE d.ticker = 'APPL' 
)
SELECT c.d, d.date AS max_date_before
FROM cte2
WHERE rn = 1
ORDER BY c.d ASC;

或者 LEFT JOIN LATERAL 和相关子查询:

WITH cte(d) AS (
       VALUES ('2016-01-01'::date)
              ,('2017-01-01'::date)
              ,('2018-01-01'::date)
       --Or unnest array_variable WITH ORDINALITY
    )
SELECT *
FROM cte c,
LEFT JOIN LATERAL (SELECT MAX(date) AS max_date_before
                   FROM  date_history d
                   WHERE d.ticker = 'APPL' 
                     AND d.date <= c.d) s;

关于sql - 有效地查找给定日期之前的多个最近日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828823/

相关文章:

postgresql - PostgreSQL 的 "OSSP"扩展中的 "ossp-uuid"代表什么?

mysql - 是否可以将我的本地 MYSQL 数据库拉/推到 heroku postgresql 数据库?

java - 如何用java制作数据库监听器?

mysql - SQL 左连接插入不起作用

sql - SELECT DISTINCT 在我的 PostgreSQL 表上比预期的要慢

mysql - 如何在 "bit field"中最好地执行分组?

python - 使用全栈 Python 应用程序打包数据库

sql - Postgres 和 Ruby 的续集 : Empty array in where-clause getting converted to slow query

mysql - 在 SQL 数据库表中,为什么冗余数据通常是一件坏事?

postgresql - POSTGRES IF 语句失败