我刚刚发现一些特定的模式在与 LIKE 文本运算符一起使用时使用 BTREE 索引来加速查询,例如:
- 'abc123'(没有通配符的文本)
- 'abc%'(最后只有一个通配符的文本)
使用仅使用大于/小于/等于运算符'%'
的模式末尾(例如)仅存在一个通配符的模式的 LIKE 文本运算符的等价物是什么?"a_column" LIKE 'abc%'
我的兴趣是在 PostgreSQL 中实现这一点,但这可能是一个 SQL 标准问题。
我刚刚发现一些特定的模式在与 LIKE 文本运算符一起使用时使用 BTREE 索引来加速查询,例如:
使用仅使用大于/小于/等于运算符'%'
的模式末尾(例如)仅存在一个通配符的模式的 LIKE 文本运算符的等价物是什么?"a_column" LIKE 'abc%'
我的兴趣是在 PostgreSQL 中实现这一点,但这可能是一个 SQL 标准问题。
我正在尝试为分布式处理系统构建查询分区器。该系统可以与支持 JDBC 的数据库一起使用。
此分区器的输入将是表的名称和用于分区的列。让我们假设此列上有一个索引。例如:
Table: customers
Partitioning column: customer_id
从那里,我将构建以下查询:
select * from customers where customer_id >= ? and customer_id < ?
然后,我想将域划分customer_id
为 10 个大小大致相同的范围。我想发出一个快速查询来解决这个问题。
我percentile_cont
在 ANSI SQL 中找到了这个函数(很好,因为很多数据库都支持这个)——我写了这个查询,它似乎有效:
SELECT
percentile_cont(customer_id, 0) over(),
percentile_cont(customer_id, 0.1) over(),
percentile_cont(customer_id, 0.2) over(),
percentile_cont(customer_id, 0.3) over(),
percentile_cont(customer_id, 0.4) over(),
percentile_cont(customer_id, 0.5) over(),
percentile_cont(customer_id, 0.6) over(),
percentile_cont(customer_id, 0.7) over(),
percentile_cont(customer_id, 0.8) over(),
percentile_cont(customer_id, 0.9) over(),
percentile_cont(customer_id, 1) over()
FROM customers LIMIT 1
我的问题是:
customer_id
被索引 - 此查询是否会相当快地快速生成范围,然后使用它们来并行化 10 个查询?我有一个如下表,其中用户操作与时间戳一起存储。我的目标是识别在特定操作(名为reference_action)之前发生的操作并计算这些操作的数量以查看哪些操作在特定操作之前发生以及它们是如何分布的。
我知道像 LAG() 这样的窗口函数,我可以在其中获取某一行之前的行,但不知道如何包含像WHERE action_name = "reference_action"
.
查询引擎是 Presto,表是 Hive 表,但我最感兴趣的是一般的 SQL 方法,因此这无关紧要。
会议 | 动作名称 | 时间戳 |
---|---|---|
1 | “一些动作” | 1970-01-01 00:01:00 |
1 | “一些动作” | 1970-01-01 00:02:00 |
1 | “一些动作” | 1970-01-01 00:03:00 |
1 | “desired_action1” | 1970-01-01 00:04:00 |
1 | “reference_action” | 1970-01-01 00:05:00 |
1 | “一些动作” | 1970-01-01 00:06:00 |
1 | “一些动作” | 1970-01-01 00:07:00 |
2 | “一些动作” | 1970-01-01 01:23:00 |
2 | “一些动作” | 1970-01-01 02:34:00 |
2 | “desired_action1” | 1970-01-01 03:45:00 |
2 | “reference_action” | 1970-01-01 04:56:00 |
2 | “一些动作” | 1970-01-01 05:58:00 |
3 | “一些动作” | 1970-01-01 01:23:00 |
3 | “一些动作” | 1970-01-01 02:34:00 |
3 | “desired_action2” | 1970-01-01 03:45:00 |
3 | “reference_action” | 1970-01-01 04:56:00 |
3 | “一些动作” | 1970-01-01 05:58:00 |
结果应如下所示:
行动 | 数数 |
---|---|
“desired_action1” | 2 |
“desired_action2” | 1 |
有两行,其中“desired_action1”直接跟在“reference_action”行之后,当按 排序时timestamp
,因此计数为 2。同样的逻辑适用于为什么“desired_action2”的计数为 1。
目标是了解用户在购买之前做了什么(购买 = reference_action)。要了解他之前做了什么,我想查找购买之前发生的操作。因此,我需要在reference_action 之前知道行中的action_name。required_actions 必须被计算,reference_actions 只是我想要计算的操作之后的行,用于确定应该计算哪些值。
截至 2020 年 9 月,PostgreSQL 声称支持大部分 SQL:2016 标准,但其中的数字根本不匹配。来自 PostgreSQL 的文档:
从 2020 年 9 月发布的第 13 版开始,PostgreSQL 至少符合SQL:2016 Core 一致性的 179 个强制性特性中的 170 个。(强调我的)
因此不支持 9 个功能。但是在其他地方,PostgreSQL 列出了它不支持的 SQL:2016 的所有特性,并且列出了309个特性。这比SQL:2016 中声称的第一页更不受支持的功能。当然,一些不受支持的功能是无关紧要的,例如“Embedded Ada”或“Module Language COBOL”,但无论哪种方式,这里列出的不受支持的功能都超过 9 个。而且我认为 SQL:2016 在 2020 年和 2021 年之间没有太大变化(甚至根本没有变化),所以这不能成为不匹配的原因。
我认为个别不受支持的特性可能会以某种方式组合成 9 个“特性”,例如,所有涉及支持死语言的特性都算作一个特性,所有与 XML 相关的特性都算作一个特性,等等,但是在略读之后309 个不受支持的功能列表,我看不出有什么明确的方法可以做到这一点。
那么,为什么会出现差异?是因为单个功能被组合在一起,还是其他原因?
我知道这些设置的作用以及何时使用它们,我真正想知道的是为什么会存在这个问题。
最近,我遇到了一个丑陋的情况——那就是另一个丑陋的情况——涉及我将称之为ANSI 七的设置:
ansi_nulls ON
ansi_padding ON
ansi_warnings ON
arithabort ON
concat_null_yields_null ON
numeric_roundabort OFF
quoted_identifier ON
我在上面列出了它们以及我认为最常推荐的默认设置。(有趣的是,SET ANSI_DEFAULTS
会将它们全部设置为 ON 或 OFF,而不对 numeric_roundabort 进行特殊处理,但我离题了。)
这些影响代码、查询、查询计划和一大堆东西,可以通过在整个 SO 中搜索它们中的任何一个来找到。有这么多的点击,很明显几十年来它们已经给成百上千的开发者带来了痛苦和痛苦。(早在 SO 提供帮助之前,我就遇到了他们的问题。)
我想知道的是:为什么?
为什么这是一个问题?这些设置是从哪里来的?谁认为这是个好主意?最重要的是,为什么这七个几乎总是混为一谈?
有人对此有任何见解吗?文章、博客甚至学习频道纪录片的链接都很棒。
我想一般使用任何 SQL 数据库(我使用的是 jdbc,如果提供了驱动程序和 URL,它就可以工作)。
似乎不同的 DBMS 对表名使用不同的引用。
例如,我在 MySQL 中有以下内容:
SELECT * FROM `tablename`;
当它是
SELECT * FROM [tablename];
在 MS SQL 服务器中。
是否有所有数据库都支持的“统一”引用?或者是否有一个 jdbc 方法可以告诉我正确的引用?
我是 Informix 的新手,我正在尝试将 bigint 转换为日期时间。
SELECT sdatetime
FROM CallDetail;
Results:
sdatetime
----------
1572509662678
1572518550704
1572519033540
这似乎是 1-1-1970 的毫秒数,但我无法正确转换它的语法。我得到的最接近的是没有时间的约会。我两个都需要。
我怎样才能做到这一点?
投影 ( select
) 值的计算是有用且常见的。然而,在投影中声明的列别名不能在那里使用。
select sellprice as x, cost as y, x/y as markup
from mytable
给出一个错误。
我可以做到这一点
select sellprice as x, cost as y, sellprice/cost as markup
from mytable
as
但这是一个简单的例子:我们通常为复杂的情况声明列别名。例如cost
,我可能有一些从average
etc 构建的函数,而不是 ,我将其声明为列别名。
如何在投影子句中使用这些别名?
在以下语句(PostgreSQL 11)中:
=> SELECT c cost FROM tt;
ERROR: syntax error at or near "cost"
LINE 1: SELECT c cost FROM tt;
我得到一个错误。在字段表达式周围添加括号无济于事 ( SELECT (c) cost FROM tt;
)。但是添加AS
关键字可以修复它。
=> SELECT c AS cost FROM tt;
cost
------
1
...
我意识到这cost
是一个关键字,但我的印象是AS
关键字是可选的。
从语言的角度来看,为什么AS
这里需要(或有用)关键字?这里的 PostgreSQL 行为是标准的还是有记录的?
是否还有其他AS
需要关键字的情况?