以下查询需要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/