我有一个SQLite表,如下所示:
ID_TABLE POINTS_A_TABLE POINTS_B_TABLE
id number id_a points_a id_b points_b
-------------- ---------------- ----------------
smith 1 smith 11 smith 25
gordon 22 gordon 11 gordon NULL
butch 3 butch 11 butch 26
sparrow 25 sparrow NULL sparrow 44
white 76 white 46 white NULL
使用以下命令
SELECT id,
avg(points_a)
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
ORDER BY avg(points_a) DESC;
我能够获得与每个名称相关联的平均点数(more details here)
id avg(points_a)
white 46.0 [(46+0)/2]
sparrow 44.0 [(0+44)/2]
butch 18.5 [(11+26)/2]
smith 18.0 [(11+25)/2]
gordon 11.0 [(11+0)/2]
现在,我希望将结果列id
与number
中ID_TABLE.number低于26 的相应列ID_TABLE
进行匹配。结果应该是(number|average
):
76 46.0 [(46 + 0)/ 2]
25 44.0 [(0+44)/2]
3 18.5 [(11+26)/2]
76 18.0 [(11+25)/2]
22 11.0 [(11+0)/2]
我如何通过结合新指令与以前的指示,在一个查询中完成?
答案 0 :(得分:1)
这看起来很简单,使用原始查询作为子查询。这不能给你你想要的东西吗?
SELECT
idt.number,
avg_points
FROM
id_table AS idt
INNER JOIN (
SELECT id,
avg(points_a) AS avg_points
FROM (SELECT id_a AS id, points_a FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b FROM points_b_table)
GROUP BY id
) as x on x.id=idt.id
WHERE
idt.number < 26;
答案 1 :(得分:1)
您需要进行JOIN,然后稍微修改您的分组以保持聚合功能正常工作。假设id_table
或points_a
中的每个相应记录points_b
中只有一条记录:
SELECT i.number,
avg(pts.points) AS average_points
FROM (SELECT id_a AS id, points_a AS points FROM points_a_table
UNION ALL
SELECT id_b AS id, points_b AS points FROM points_b_table) AS pts
INNER JOIN id_table i ON i.id = pts.id
GROUP BY pts.id, i.number
WHERE i.number < 26
ORDER BY avg(pts.points) DESC;