我有以下SQL查询,它们应该写入类似的结果WRT偏移量列,但没有.

问题1:一个问题:

SELECT visitor_id, array_agg(timestamp) as time, array_agg(offset) as offset_list 
from
(SELECT * FROM 
(
SELECT visitor_id, timestamp,
cast(json_extract(uri_args, '$.offset') AS int) as offset


FROM table_t 
where year = 2023 and month = 1 and day = 27 and 

request_uri = '/home_page')
order by visitor_id, timestamp)
group by visitor_id 
order by cardinality(offset_list) desc 

问题2:你是什么意思?

SELECT visitor_id ,array_agg(offset) as offset_list 
from
(SELECT * FROM 
(
SELECT visitor_id, timestamp,
cast(json_extract(uri_args, '$.offset') AS int) as offset


FROM table_t 
where year = 2023 and month = 1 and day = 27 and 

request_uri = '/home_page')
order by visitor_id, timestamp)
group by visitor_id 
order by cardinality(offset_list) desc

这里的uri_args只是一个json文件,在关键字‘Offset’下包含特定API响应的偏移量的值.这来自服务器的响应日志(log)表.

尽管这两个查询很相似,并且我认为应该在OFFSET_LIST列中返回相同的值,但我发现了以下差异:

为了清楚地表达这一点,我将考虑一个特定的访问者ID,对于访问者id=‘12345’查询,我在Offset_List列中返回以下行

[0, 0, 0, 10, 0, 10, 20, 32, 42, 0, 0, 20, 53, 77, 57, 0, 10, 20, 31, 10, 41, 0, 10, 41, 54, 77, 0, 10, 31, 41, 54, 10, 31, 54, 57, 77, 10, 20, 32, 0, 10, 21, 33, 44, 72, 52, 0, 10, 20, 31, 41]

对于查询2,输出如下:

[20, 32, 42, 0, 0, 20, 53, 77, 57, 0, 10, 20, 31, 10, 41, 0, 10, 41, 54, 77, 0, 10, 31, 41, 54, 10, 31, 54, 77, 57, 10, 20, 32, 0, 10, 21, 33, 44, 72, 52, 0, 10, 20, 31, 41, 0, 0, 0, 10, 0, 10]

我可以观察到这两者是彼此的循环排列,但我看不出为什么会发生这种情况.请帮助我了解每个查询的内部工作原理有什么不同.第一个回复符合我的任务意图,即在主页上捕捉访客的旅程.

推荐答案

如果您需要对数组元素进行确定性排序,请为聚合函数指定order by子句,如第docs部分所述

某些聚合函数(如array_agg())会根据输入值的顺序产生不同的结果.可以通过在聚合函数中编写ORDER BY子句来指定此顺序

SELECT visitor_id ,array_agg(offset order by timestamp) as offset_list 
-- ...

Sql相关问答推荐

如何查询未命名对象的SON数组

PostgreSQL:获取每家店铺收入最高的员工

GROUP BY和GROUP_CONCAT用于计算比赛排名

SQL查询组类值在同一行中,并连接和排序其他值

替换条件中的单元格值

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

如何更新SQLite数据库中的表?

如何查找所提供日期范围的所有季度开始日期和结束日期

将计算列设置为持久化的目的是什么?

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

是否可以为表中的所有列生成散列值?

排除具有部分匹配条件的记录

SQL仅返回第一个字母在A-Z之间的值

Proc SQL Select Distinct SAS

存储过程太慢

MySQL中的递归查询邻接表深度优先?

SQL Server 查询 WHERE LIKE

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

如何根据某个值在where子句中添加某个条件

如何更改 duckdb R 中的数据约束