【问题标题】:PostgreSQL 12 Vs. Pandas Sub Query OptimizationPostgreSQL 12 对比Pandas 子查询优化
【发布时间】:2021-09-24 14:52:51
【问题描述】:

我在 PostgreSQL 中有一个表,我想在其中选择任何新的“ticker”值,这些值不在之前的“trade_date”表中。

以下查询需要 1 分钟才能运行,并且该表包含大约 56k 行:

SELECT DISTINCT a.trade_date, a.ticker, a.company_name
FROM t_ark_holdings a
WHERE a.ticker NOT IN (
                        SELECT b.ticker FROM t_ark_holdings b WHERE b.trade_date <a.trade_date
                        )
ORDER BY a.trade_date DESC, a.ticker, a.company_name

我的表结构如下:

我想知道一些事情:

  1. 这是编写 SQL 查询的有效方法吗
  2. 我是否应该将“trade_date”和“ticker”的索引添加到表结构中
  3. 切换到 pandas 是否会有所帮助,因为表格会随着时间的推移而变大 谢谢

编辑: 添加想要的结果:

例如,在 21 年 9 月 17 日,有一些代码(以红色突出显示)在前几天

没有出现在表格中

【问题讨论】:

  • 我不明白那个子查询的目的。它在做你期望的事情吗?

标签: sql python-3.x pandas postgresql subquery


【解决方案1】:

您正在选择子查询中的所有结果,这会在 RDBMS 的内存中生成大量数据,与您的值进行比较。相反,您应该使用带有WHERE 子句的LEFT JOIN,如下所示:

SELECT a.trade_date, a.ticker, a.company_name
FROM t_ark_holdings a
LEFT JOIN t_ark_holdings b
ON a.ticker = b.ticker and b.trade_date < a.trade_date
WHERE b.ticker IS NULL
ORDER BY a.trade_date DESC, a.ticker, a.company_name

此查询假设任何b 记录具有相同的ticker a,但日期更早,WHERE 子句检查它是否存在,如果不存在则只包含结果.请注意,我删除了 DISTINCT 关键字,假设您在同一日期的最新发现中不会有多个 ticker 值。如果查询仍然很慢,那么您可能需要一个索引。尝试创建索引并将性能与没有索引的性能进行比较。

要说明的另一点是,您谈论的是上一个交易日期。如果这是一个已知的日期或日期范围,那么您可以进一步检查b 是否在该日期/日期范围内。

【讨论】:

  • 感谢您的解释,现在不到 1 秒即可获得相同的结果。最佳
  • @JeJe 很乐意为您提供帮助!
【解决方案2】:

如果您想要每个ticker/company_name 的第一行,请使用distinct on

select distinct on (a.ticker, a.company_name) a.*
from t_ark_holdings a
order by a.ticker, a.company_name, a.trade_date;

(ticker, company_name, trade_date) 上有一个索引,这应该是快得令人眼花缭乱的东西。

【讨论】:

  • 谢谢,我已经用结果示例编辑了问题。 Lajos Arpad 的答案有效(需要所有前几天不在表中的代码,每天滚动)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多