Eu tenho um banco de dados de ações codificadas com essa estrutura.
{User, Date, ActionCode}
Preciso gerar relatórios com base em datas e códigos de ação, e os códigos de ação não estão limpos porque temos que importá-los de várias fontes.
Posso lidar com a maioria deles (como o número médio de vezes que os usuários executam o ActionCode 13).
Mas, aqui está o que estou tendo problemas: o número médio de vezes que os usuários executam uma ação que pode ser definida por qualquer um dos códigos de ação 61, 62, 700 ou 701. Essa ação também pode ser definida usando ambas as ações códigos 84 e 85 ou usando os três códigos de ação 10, 11 e 12.
Aqui está o que eu tenho que lida com o primeiro conjunto de códigos de ação:
select
average(cnt)
from
(
select
count(distinct(date)) as cnt
from
codes
where
actioncode in (61, 62, 700, 701)
group by user
)
Eu uso data distinta porque alguns usuários codificam para vários lugares e recebemos de volta mais de um código para a ação. Como adiciono "ou eles tiveram 84 e 85 na mesma data"?
Uma das muitas maneiras possíveis:
Não precisamos de parênteses, pois a precedência do operador funciona a nosso favor.
DISTINCT
ainda é necessário apenas se houver duplicatas. Os casos para (10 + 11 + 12) e (84 + 85) produzem apenas uma única linha.Estou usando
usr
em vez deuser
, pois não me sinto confortável em abusar de palavras reservadas como identificadores.date
também não é uma boa ideia.