gpt4 book ai didi

SQL 查找非空列

转载 作者:行者123 更新时间:2023-12-04 23:34:32 25 4
gpt4 key购买 nike

我有一个时间序列数据表,我需要在其中找到在给定时间段内包含至少一个非空值的所有列。到目前为止,我正在使用以下查询:

select max(field1),max(field2),max(field3),... 
from series where t_stamp between x and y

之后我检查结果的每个字段是否包含非空值。

该表大约有 70 列,一个时间段可以包含 > 100k 个条目。

我想知道是否有更快的方法来做到这一点(仅使用标准 sql)。

编辑:
不幸的是,重构表设计对我来说不是一个选择。

最佳答案

EXISTS 操作可能会更快,因为它可以在找到任何符合条件的行(与您正在使用的 MAX 相比)后立即停止搜索。这取决于您的数据以及您的 SQL 服务器的智能程度。如果您的大多数列具有很高的非空数据率,那么此方法将快速找到行并且它应该运行得很快。如果您的列主要是 NULL 值,那么您的方法可能会更快。我会给他们一个机会,看看他们是如何优化的以及他们是如何运行的。另请记住,如果您的数据分布发生显着变化,则性能可能会随着时间的推移而发生变化。

另外,我只在 MS SQL Server 上测试过。一年多来,我不必编写严格的 ANSI 兼容 SQL,所以我不确定这是否完全通用。

SELECT
CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field1 IS NOT NULL) THEN 1 ELSE 0 END AS field1,
CASE WHEN EXISTS (SELECT * FROM Series WHERE t_stamp BETWEEN @x AND @y AND field2 IS NOT NULL) THEN 1 ELSE 0 END AS field2,
...

编辑:只是为了澄清,MAX 方法可能更快,因为它可以通过一次通过数据来确定这些值。从理论上讲,这里的方法也可以,并且可能少于完整遍,但您的优化器可能无法识别所有子查询都是相关的,因此它可能会为每个子查询执行单独的遍。那仍然可能更快,但正如我所说,这取决于您的数据。

关于SQL 查找非空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/330612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com