我有一个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视为相同。我是否仍然可以通过“分组”实现这一目标,还是有其他方式?
答案 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关键字,如果不支持,则只删除该关键字 - 功能应该相同。