Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于JSONB first值按查询对组进行排序_Sql_Arrays_Postgresql_Jsonb_Unnest - Fatal编程技术网

Sql 基于JSONB first值按查询对组进行排序

Sql 基于JSONB first值按查询对组进行排序,sql,arrays,postgresql,jsonb,unnest,Sql,Arrays,Postgresql,Jsonb,Unnest,我正在使用PostgreSQL,我有以下SQL查询 WITH A AS ( SELECT *, jsonb_array_elements(event_days) as event_days_arr FROM event ) SELECT event_id::int, MAX(area_id)::int AS area_id, array_agg(event_days_arr) as event_days FROM A WHERE ev

我正在使用PostgreSQL,我有以下SQL查询

    WITH A AS
(
    SELECT *,
    jsonb_array_elements(event_days) as event_days_arr
    FROM event
)
SELECT event_id::int, 
    MAX(area_id)::int AS area_id, 
    array_agg(event_days_arr) as event_days
FROM A 
WHERE
    event_days_arr->>'start_datetime' >= '2020-12-22' AND
    event_days_arr->>'end_datetime' < '2020-12-22T19:00:00'
GROUP BY event_id, event_alias
ORDER BY 
    (event_days_arr->0->>'start_datetime'),
    (event_days_arr->0->>'end_datetime');
我试过使用event_days、event_days_arr,但我无法根据每行JSONB数组的第一个元素对查询结果排序


任何人都可以帮我排序这个查询的结果,请?

我想你想按事件天数的第一个元素分组,而不是按事件天数的第一个元素分组

这不管用吗

WITH A AS (
    SELECT *, jsonb_array_elements(event_days) as event_days_arr
    FROM event
)
SELECT event_id::int, 
    MAX(area_id::int) AS area_id, 
    ARRAY_AGG(event_days_arr) as event_days
FROM A 
WHERE
    event_days_arr ->> 'start_datetime' >= '2020-12-22' AND
    event_days_arr ->> 'end_datetime'   <  '2020-12-22T19:00:00'
GROUP BY event_id, event_alias
ORDER BY 
    event_days -> 0 ->> 'start_datetime',
    event_days -> 0 ->> 'end_datetime';

将时间范围的WHERE条件移动到公共表表达式中,这可以在FROM子句中使用set返回函数后完成,在FROM子句中应该使用set返回函数:

外部聚合也应该使用jsonb_agg not array_agg来完成,因为->操作符只为JSON数组定义,而不是为本机数组定义

列别名只能按零件顺序使用。如果要使用表达式,则需要第二级,例如使用派生表或CTE:

WITH A AS
(
  SELECT *
  FROM event
    cross join jsonb_array_elements(event_days) as arr(event_day)
  WHERE arr.event_day ->> 'start_datetime' >= '2020-12-22' 
    AND arr.event_day ->> 'end_datetime' < '2020-12-22T19:00:00'
)
SELECT * 
FROM (
  SELECT event_id::int, 
         MAX(area_id)::int AS area_id, 
         jsonb_agg(event_day) as event_days
  FROM A 
  GROUP BY event_id, event_alias
) t
ORDER BY event_days -> 0 ->> 'start_datetime',
         event_days -> 0 ->>'end_datetime'

我想做的是按事件id和事件别名分组,就像我刚才做的那样。正在尝试按日期时间数组进行分组。。。。这听起来很奇怪,但感谢您的关注还有一件事,我发现如果您使用数组agg函数,并尝试按其元素排序,即使group by允许您这样做,您也需要访问事件日期的第一个元素,例如:事件日期[0]->“开始日期时间”,而不是像我之前所说的事件日期->>“开始日期时间”
GROUP BY event_id, event_alias, event_days -> 0 ->> 'start_datetime', event_days -> 0 ->> 'end_datetime'
WITH A AS
(
  SELECT *
  FROM event
    cross join jsonb_array_elements(event_days) as arr(event_day)
  WHERE arr.event_day ->> 'start_datetime' >= '2020-12-22' 
    AND arr.event_day ->> 'end_datetime' < '2020-12-22T19:00:00'
)
SELECT * 
FROM (
  SELECT event_id::int, 
         MAX(area_id)::int AS area_id, 
         jsonb_agg(event_day) as event_days
  FROM A 
  GROUP BY event_id, event_alias
) t
ORDER BY event_days -> 0 ->> 'start_datetime',
         event_days -> 0 ->>'end_datetime'