查询 JSONB 数组长度可变的 select 行
Query to select rows where JSONB arrays have variable lengths
我有一个 table (t
),其中包含一列 (c
) JSONB 对象,每个对象包含一个长度可变的数组 (a
) 1-10(含)之间。我需要构建一个查询,从 t
中选择 1000 行,其中 c
包括 100 行 每个 可能长度 a
。编写此查询最简洁的方法是什么?我当前的查询结构如下所示:
WITH length_1 AS (
SELECT *
FROM t
WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 1
ORDER BY RANDOM()
LIMIT 100
),
length_2 AS (
SELECT *
FROM t
WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 2
ORDER BY RANDOM()
LIMIT 100
)
...
SELECT *
FROM length_1
UNION
SELECT *
FROM length_2
...
您可以使用 window 函数在其分区内用行号标记每一行,然后使用外部 select 将每个分区限制为 100。
select * from (
select t.*, row_number() over (partition by jsonb_array_length(c->'a') order by random()) as rn from t
) foo where rn<=100;
这两个级别是必需的,因为您不能在 WHERE 或 HAVING 中使用 window 函数。
我有一个 table (t
),其中包含一列 (c
) JSONB 对象,每个对象包含一个长度可变的数组 (a
) 1-10(含)之间。我需要构建一个查询,从 t
中选择 1000 行,其中 c
包括 100 行 每个 可能长度 a
。编写此查询最简洁的方法是什么?我当前的查询结构如下所示:
WITH length_1 AS (
SELECT *
FROM t
WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 1
ORDER BY RANDOM()
LIMIT 100
),
length_2 AS (
SELECT *
FROM t
WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 2
ORDER BY RANDOM()
LIMIT 100
)
...
SELECT *
FROM length_1
UNION
SELECT *
FROM length_2
...
您可以使用 window 函数在其分区内用行号标记每一行,然后使用外部 select 将每个分区限制为 100。
select * from (
select t.*, row_number() over (partition by jsonb_array_length(c->'a') order by random()) as rn from t
) foo where rn<=100;
这两个级别是必需的,因为您不能在 WHERE 或 HAVING 中使用 window 函数。