1

私は次のようなsqliteテーブル「ログ」を持っています:

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_id1と5の平均的な視聴者を合計します。それ、どうやったら出来るの?テーブルがはるかに大きいことに注意してください。2つのp_idを同じものとして複数回扱う必要があります。これを達成するために「groupby」を実行できますか、それとも他の方法がありますか?

4

1 に答える 1

2

私はこれを試しましたが、少なくともmySQLで動作します。

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

編集:フィールド「alias_from_id」および「aliased_as」で「aliases」という名前のエイリアステーブルを使用する場合:

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クエリを少し単純化することは可能かもしれませんが、これは現時点で私ができる最善の方法です:)

Edit2: ISNULLを対応するSQLiteIFNULL関数に変更しました

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キーワードをサポートしているかどうかはわかりませんが、サポートしていない場合は、そのキーワードを削除するだけです。機能は同じである必要があります。

于 2012-05-08T18:17:01.177 に答える