SET any_join_distinct_right_table_keys = 1;
SET joined_subquery_requires_alias = 0;

SELECT
    loyalty,
    count()
FROM test.hits ANY LEFT JOIN
(
    SELECT
        UserID,
        sum(SearchEngineID = 2) AS yandex,
        sum(SearchEngineID = 3) AS google,
        toInt8(if(yandex > google, yandex / (yandex + google), -google / (yandex + google)) * 10) AS loyalty
    FROM test.hits
    WHERE (SearchEngineID = 2) OR (SearchEngineID = 3)
    GROUP BY UserID
    HAVING (yandex + google) > 10
) USING UserID
GROUP BY loyalty
ORDER BY loyalty ASC;


SELECT
    loyalty,
    count()
FROM
(
    SELECT UserID
    FROM test.hits
) ANY LEFT JOIN
(
    SELECT
        UserID,
        sum(SearchEngineID = 2) AS yandex,
        sum(SearchEngineID = 3) AS google,
        toInt8(if(yandex > google, yandex / (yandex + google), -google / (yandex + google)) * 10) AS loyalty
    FROM test.hits
    WHERE (SearchEngineID = 2) OR (SearchEngineID = 3)
    GROUP BY UserID
    HAVING (yandex + google) > 10
) USING UserID
GROUP BY loyalty
ORDER BY loyalty ASC;


SELECT
    loyalty,
    count()
FROM
(
    SELECT
        loyalty,
        UserID
    FROM
    (
        SELECT UserID
        FROM test.hits
    ) ANY LEFT JOIN
    (
        SELECT
            UserID,
            sum(SearchEngineID = 2) AS yandex,
            sum(SearchEngineID = 3) AS google,
            toInt8(if(yandex > google, yandex / (yandex + google), -google / (yandex + google)) * 10) AS loyalty
        FROM test.hits
        WHERE (SearchEngineID = 2) OR (SearchEngineID = 3)
        GROUP BY UserID
        HAVING (yandex + google) > 10
    ) USING UserID
)
GROUP BY loyalty
ORDER BY loyalty ASC;


SELECT
    loyalty,
    count() AS c,
    bar(log(c + 1) * 1000, 0, log(3000000) * 1000, 80)
FROM test.hits ANY INNER JOIN
(
    SELECT
        UserID,
        toInt8(if(yandex > google, yandex / (yandex + google), -google / (yandex + google)) * 10) AS loyalty
    FROM
    (
        SELECT
            UserID,
            sum(SearchEngineID = 2) AS yandex,
            sum(SearchEngineID = 3) AS google
        FROM test.hits
        WHERE (SearchEngineID = 2) OR (SearchEngineID = 3)
        GROUP BY UserID
        HAVING (yandex + google) > 10
    )
) USING UserID
GROUP BY loyalty
ORDER BY loyalty ASC;
