在GROUP BY下合并ID?

时间:2012-05-08 18:14:01

标签: sqlite group-by

我有一个sqlite表“log”,如下所示:

ID     p_id     viewer
----------------------
1      1        100
2      1        200
3      1        300
4      3        550
5      3        230
6      5        420
7      2        320
8      2        203
9      9        10
10     9        55

我想从每个p_id获得普通观众。那就是

SELECT avg(viewer) FROM log GROUP BY p_id

但是我想将p_id 1和5视为相同,所以我会得到p_id 1和5的平均观看者。我怎么做?请注意,表格要大得多,我需要多次将两个p_id视为相同。我是否仍然可以通过“分组”实现这一目标,还是有其他方式?

1 个答案:

答案 0 :(得分:2)

我试过这个,至少可以和mySQL一起使用。

SELECT avg(viewer) FROM log GROUP BY CASE p_id WHEN 5 THEN 1 ELSE p_id END;

编辑:使用名为'aliases'的别名表,其字段为'alias_from_id'和'aliased_as':

SELECT
CASE ISNULL((SELECT aliased_as FROM aliases WHERE (alias_from_id = log.pid))) 
WHEN 1 THEN log.pid ELSE aliased_as END AS the_id,
SUM(value) AS value_sum
FROM log
LEFT JOIN aliases ON (alias_from_id = pid)
GROUP BY
CASE ISNULL((SELECT aliased_as FROM aliases WHERE (alias_from_id = log.pid)))
WHEN 1 THEN log.pid ELSE aliased_as END 

我用mySQL测试了它,它就像一个魅力。可能有点简化这个SQL查询,但这是我现在能做的最好的事情:))

编辑2:将ISNULL更改为相应的SQLite IFNULL函数

SELECT
IFNULL((SELECT aliased_as FROM aliases WHERE (alias_from_id = log.pid)), log.pid) AS the_id,
SUM(value) AS value_sum
FROM log
LEFT JOIN aliases ON (alias_from_id = pid)
GROUP BY
IFNULL((SELECT aliased_as FROM aliases WHERE (alias_from_id = log.pid)), log.pid)

我不知道SQLite是否支持AS关键字,如果不支持,则只删除该关键字 - 功能应该相同。