サンプルSQL

ゲーム結果(月間)
SELECT
    datetime(playtime) AS 日時,
    p1_name AS 東家, p1_rpoint * 100 AS 素点, p1_rank AS 順位, p1_point AS ポイント,
    p2_name AS 南家, p2_rpoint * 100 AS 素点, p2_rank AS 順位, p2_point AS ポイント,
    p3_name AS 西家, p3_rpoint * 100 AS 素点, p3_rank AS 順位, p3_point AS ポイント,
    p4_name AS 北家, p4_rpoint * 100 AS 素点, p4_rank AS 順位, p4_point AS ポイント,
    deposit AS 供託
FROM
    game_results
WHERE
    playtime BETWEEN datetime(strftime('%Y-%m-01 12:00:00')) AND datetime(strftime('%Y-%m-01 12:00:00'), '1 month', '-1 second')
;
全体成績サマリ(年間)
SELECT
    name AS プレイヤー名,
    count() AS ゲーム数,
    round(sum(point), 1) AS 通算ポイント,
    round(avg(point), 1) AS 平均ポイント,
    count(rank = 1 OR NULL) AS "1位",
    count(rank = 2 OR NULL) AS "2位",
    count(rank = 3 OR NULL) AS "3位",
    count(rank = 4 OR NULL) AS "4位",
    printf("%.2f", round(avg(rank), 2)) AS 平均順位,
    printf("%.2f%", round(CAST(count(rank = 1  OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2)) AS トップ率,
    printf("%.2f%", round(CAST(count(rank <= 2 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2)) AS 連対率,
    printf("%.2f%", round(CAST(count(rank <= 3 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2)) AS ラス回避率,
    printf("%.2f%", round(CAST(count(rank = 4  OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2)) AS ラス率,
    count(rpoint < 0 OR NULL) AS トビ,
    printf("%.2f%", round(CAST(count(rpoint < 0 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2)) AS トビ率,
    max(rpoint) AS 最大素点,
    min(rpoint) AS 最小素点,
    round(avg(rpoint), 1) AS 平均素点
FROM
    individual_results
WHERE
    playtime BETWEEN datetime(strftime('%Y-01-01 12:00:00')) AND datetime(strftime('%Y-12-01 12:00:00'), '1 month', '-1 second') -- 集計期間
GROUP BY
    name
HAVING
    ゲーム数 > (SELECT count() * 0.01 FROM result WHERE playtime BETWEEN datetime(strftime('%Y-01-01 12:00:00')) AND datetime(strftime('%Y-12-01 12:00:00'), '1 month', '-1 second')) -- 規定打数
ORDER BY
    通算ポイント DESC
;
月間ランキング
SELECT
    collection AS 集計月,
    max(CASE WHEN rank = 1 THEN name END) AS "1位",
    max(CASE WHEN rank = 1 THEN total END) AS "ポイント",
    max(CASE WHEN rank = 1 THEN game_count END) AS "ゲーム数",
    max(CASE WHEN rank = 2 THEN name END) AS "2位",
    max(CASE WHEN rank = 2 THEN total END) AS "ポイント",
    max(CASE WHEN rank = 2 THEN game_count END) AS "ゲーム数",
    max(CASE WHEN rank = 3 THEN name END) AS "3位",
    max(CASE WHEN rank = 3 THEN total END) AS "ポイント",
    max(CASE WHEN rank = 3 THEN game_count END) AS "ゲーム数",
    max(CASE WHEN rank = 4 THEN name END) AS "4位",
    max(CASE WHEN rank = 4 THEN total END) AS "ポイント",
    max(CASE WHEN rank = 4 THEN game_count END) AS "ゲーム数",
    max(CASE WHEN rank = 5 THEN name END) AS "5位",
    max(CASE WHEN rank = 5 THEN total END) AS "ポイント",
    max(CASE WHEN rank = 5 THEN game_count END) AS "ゲーム数"
FROM (
    SELECT
        substr(collection_daily, 1, 7) AS collection,
        rank() OVER (PARTITION BY substr(collection_daily, 1, 7) ORDER BY round(sum(point), 1) DESC) AS rank,
        name,
        round(sum(point), 1) AS total,
        count() AS game_count
    FROM
        individual_results
    GROUP BY
        name, collection_daily
)
GROUP BY
    collection
HAVING
    collection LIKE strftime("%Y-%%")
;
ゲーム傾向
SELECT
    substr(collection_daily, 1, 7) AS 集計月,
    count() / 4 AS ゲーム数,
    round(sum(point), 1) AS 供託,
    count(rpoint < -1 OR NULL) AS "飛んだ人数(延べ)",
    round(CAST(count(rpoint < -1 OR NULL) AS REAL) / CAST(count() / 4 AS REAL) * 100, 2) AS トビ終了率,
    max(rpoint) AS 最大素点,
    min(rpoint) AS 最小素点
FROM
    individual_results
GROUP BY
    substr(collection_daily, 1, 7)
HAVING
    collection_daily LIKE strftime("%Y-%%")
;
個人成績
SELECT
    substr(collection_daily, 1, 7) AS 集計月,
    count() AS ゲーム数,
    round(sum(point), 1) AS 通算ポイント,
    round(avg(point), 1) AS 平均ポイント,
    count(rank = 1 OR NULL) AS "1位",
    count(rank = 2 OR NULL) AS "2位",
    count(rank = 3 OR NULL) AS "3位",
    count(rank = 4 OR NULL) AS "4位",
    round(avg(rank), 2) AS 平均順位,
    round(CAST(count(rank = 1  OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS トップ率,
    round(CAST(count(rank <= 2 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS 連対率,
    round(CAST(count(rank <= 3 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS ラス回避率,
    round(CAST(count(rank = 4  OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS ラス率,
    count(rpoint < -1 OR NULL) AS トビ,
    round(CAST(count(rpoint < -1 OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS トビ率,
    max(rpoint) AS 最大素点,
    min(rpoint) AS 最小素点,
    round(avg(rpoint), 1) AS 平均素点
FROM
    individual_results
WHERE
    name = "<Player Name>"
GROUP BY
    substr(collection_daily, 1, 7)
HAVING
    collection_daily LIKE strftime("%Y-%%")
;

全体成績サマリのHAVING句で絞るでも。

直近のN回
SELECT * FROM (
    SELECT * FROM
        game_results
    WHERE
        "<Player Name>" IN (p1_name, p2_name, p3_name, p4_name)
    ORDER BY
        playtime DESC
    LIMIT 30 -- 直近のゲーム数
)
ORDER BY
    playtime
;
対戦結果(対個人)
SELECT
    my.name AS プレイヤー,
    vs.name AS 対戦相手,
    printf("%3d%3d%3d敗",
        count(),
        count(my.rank < vs.rank OR NULL),
        count(my.rank > vs.rank OR NULL)
    ) AS 対戦結果,
    round(CAST(count(my.rank < vs.rank OR NULL) AS REAL) / CAST(count() AS REAL) * 100, 2) AS 勝率
FROM
    individual_results my
INNER JOIN
    individual_results vs
        ON (my.playtime = vs.playtime AND my.name != vs.name)
GROUP BY
    my.name, vs.name
HAVING
    my.name = "<Player Name>"
ORDER BY
    count() DESC
;
ゲーム毎の通算ポイント(移動合計)、平均ポイント(移動平均)
SELECT
    count() OVER moving AS count,
    playtime,
    rank,
    point,
    round(sum(point) OVER moving, 1) AS point_sum,
    round(avg(point) OVER moving, 1) AS point_avg,
    round(avg(rank) OVER moving, 2) AS rank_avg
FROM
    individual_results
WHERE
    name = "<Player Name>"
WINDOW
    moving AS (PARTITION BY name ORDER BY playtime)
;