postgreSQL分组查询中位数,偶数行输出中间两条记录
在PostgreSQL中,计算组内数据的中位数可以使用窗口函数NTILE
。如果是偶数行,则输出中间两条记录。
以下是一个示例SQL查询,它使用NTILE
窗口函数将组内的记录分为两部分,然后根据组的大小选择中间记录。
WITH RankedData AS (
SELECT
*,
NTILE(2) OVER (PARTITION BY group_id ORDER BY value) AS half_rank
FROM
your_table
),
CountPerGroup AS (
SELECT
group_id,
COUNT(*) OVER (PARTITION BY group_id) AS cnt
FROM
your_table
)
SELECT
group_id,
value
FROM
RankedData
JOIN
CountPerGroup USING (group_id)
WHERE
half_rank = 1
AND cnt % 2 = 0; -- 只保留偶数行的组
在这个查询中,RankedData
CTE 使用 NTILE(2)
将每个组的记录分为两组(对于奇数行组来说,这会使得中间记录落在half_rank
=1的组中)。CountPerGroup
CTE 计算每个组的记录数。最后的SELECT语句选择 half_rank
为1的记录,即中间的记录,仅当组有偶数行时。
请确保将 your_table
替换为你的实际表名,group_id
替换为你的分组依据的列名,value
替换为你要排序的列名。
评论已关闭