sql >> データベース >  >> RDS >> Mysql

MySQL8.0の新しい分析ウィンドウ関数のレビュー

    データはさまざまな理由でキャプチャおよび保存されます。データの収集、取り込み、構造化、検証、および最終的な保存に費やされた数え切れないほどの時間(およびさらに多くの予算)。それが貴重な資産であると言うことは、論点を家に追いやることです。この時代、それは実際、私たちの最も貴重な商品かもしれません。

    一部のデータは厳密にアーカイブとして使用されます。おそらく、過去に発生したイベントを記録または追跡するためです。しかし、そのコインの反対側は、履歴データが将来および将来の取り組みの基礎となる決定に価値があるということです。

    • セールは何日になりますか? (過去のやり方に基づいて将来の販売を計画しています。)
    • 第1四半期に最高の業績を上げた営業担当者は誰ですか? (振り返ってみると、彼らの努力に対して誰に報いることができますか。)
    • 7月中旬に最も頻繁に訪れるレストランはどれですか? (旅行シーズンが迫っています...私たちの食料品や商品を誰に売ることができますか?)

    あなたは絵を手に入れます。手元のデータを使用することは、どの組織にとっても不可欠です。

    多くの企業は、データを使用してサービスを構築、基盤化し、提供しています。彼らはそれに依存しています。

    数ヶ月前、あなたがこれを読んでいる時期にもよりますが、私は真剣に、体重を減らし、健康を管理し、私たちが住んでいるこの忙しい世界から毎日少しの孤独を求めて、運動のために歩き始めました。

    履物に関しては非常にうるさい傾向があるため、どの靴を履いていたかを考慮しても、モバイル歩数計アプリを使用してハイキングを追跡しました。

    このデータは上記のシナリオで述べたものほど重要ではありませんが、私にとって、何かを学ぶための重要な要素は、興味があり、関連し、理解できるものを使用することです。

    ウィンドウ関数は、長い間探求するために私のレーダーにありました。それで、私はこの投稿でそれらのいくつかで私の手を試してみようと思いました。最近MySQL8でサポートされたので(MySQL 8のアップグレードと新しい追加について簡単に触れたこのSevereninesブログにアクセスしてください)、ここで使用するのはエコシステムです。注意してください、私はウィンドウ分析機能の第一人者ではありません。

    MySQLウィンドウ関数とは何ですか?

    MySQLのドキュメントでは、次のように定義されています。 "ウィンドウ関数は、クエリ行のセットに対して集計のような操作を実行します。ただし、集計操作はクエリ行を単一の結果行にグループ化しますが、ウィンドウ関数は次の結果を生成します。各クエリ行: "

    この投稿のデータセットと設定

    散歩からキャプチャしたデータを次のテーブルに保存します:

    mysql> DESC hiking_stats;
    +-----------------+--------------+------+-----+---------+-------+
    | Field           | Type         | Null | Key | Default | Extra |
    +-----------------+--------------+------+-----+---------+-------+
    | day_walked      | date         | YES  |     | NULL    |       |
    | burned_calories | decimal(4,1) | YES  |     | NULL    |       |
    | distance_walked | decimal(4,2) | YES  |     | NULL    |       |
    | time_walking    | time         | YES  |     | NULL    |       |
    | pace            | decimal(2,1) | YES  |     | NULL    |       |
    | shoes_worn      | text         | YES  |     | NULL    |       |
    | trail_hiked     | text         | YES  |     | NULL    |       |
    +-----------------+--------------+------+-----+---------+-------+
    7 rows in set (0.01 sec)

    ここには90日近くのデータがあります:

    mysql> SELECT COUNT(*) FROM hiking_stats;
    +----------+
    | COUNT(*) |
    +----------+
    |       84 |
    +----------+
    1 row in set (0.00 sec)

    確かに、私は自分の靴に気が狂っているので、どの靴が一番好きかを判断しましょう。

    mysql> SELECT DISTINCT shoes_worn, COUNT(*)
        -> FROM hiking_stats
        -> GROUP BY shoes_worn;
    +---------------------------------------+----------+
    | shoes_worn                            | COUNT(*) |
    +---------------------------------------+----------+
    | New Balance Trail Runners-All Terrain |       30 |
    | Oboz Sawtooth Low                     |       47 |
    | Keen Koven WP(keen-dry)               |        6 |
    | New Balance 510v2                     |        1 |
    +---------------------------------------+----------+
    4 rows in set (0.00 sec)

    より適切で管理しやすい画面上のデモンストレーションを提供するために、クエリ結果の残りの部分を、47回着用したお気に入りの靴の部分だけに制限します。

    また、trail_hiked列があり、'ウルトラエクササイズモードでした。 'このほぼ3か月の間に、私は庭を押し刈りながらカロリーを数えました:

    mysql> SELECT DISTINCT trail_hiked, COUNT(*)
        -> FROM hiking_stats
        -> GROUP BY trail_hiked;
    +------------------------+----------+
    | trail_hiked            | COUNT(*) |
    +------------------------+----------+
    | Yard Mowing            |       14 |
    | Sandy Trail-Drive      |       20 |
    | West Boundary          |       29 |
    | House-Power Line Route |       10 |
    | Tree Trail-extended    |       11 |
    +------------------------+----------+
    5 rows in set (0.01 sec)

    ただし、データセットをさらに制限するために、これらの行も除外します。

    mysql> SELECT COUNT(*)
        -> FROM hiking_stats
        -> WHERE shoes_worn = 'Oboz Sawtooth Low'
        -> AND
        -> trail_hiked <> 'Yard Mowing';
    +----------+
    | COUNT(*) |
    +----------+
    |       40 |
    +----------+
    1 row in set (0.01 sec)

    シンプルさと使いやすさのために、使用する列のビューを作成します:

    mysql> CREATE VIEW vw_fav_shoe_stats AS
        -> (SELECT day_walked, burned_calories, distance_walked, time_walking, pace, trail_hiked
        -> FROM hiking_stats
        -> WHERE shoes_worn = 'Oboz Sawtooth Low'
        -> AND trail_hiked <> 'Yard Mowing');
    Query OK, 0 rows affected (0.19 sec)

    このデータセットを残しておく:

    mysql> SELECT * FROM vw_fav_shoe_stats;
    +------------+-----------------+-----------------+--------------+------+------------------------+
    | day_walked | burned_calories | distance_walked | time_walking | pace | trail_hiked            |
    +------------+-----------------+-----------------+--------------+------+------------------------+
    | 2018-06-03 |           389.6 |            4.11 | 01:13:19     |  3.4 | Sandy Trail-Drive      |
    | 2018-06-04 |           394.6 |            4.26 | 01:14:15     |  3.4 | Sandy Trail-Drive      |
    | 2018-06-06 |           384.6 |            4.10 | 01:13:14     |  3.4 | Sandy Trail-Drive      |
    | 2018-06-07 |           382.7 |            4.12 | 01:12:52     |  3.4 | Sandy Trail-Drive      |
    | 2018-06-17 |           296.3 |            2.82 | 00:55:45     |  3.0 | West Boundary          |
    | 2018-06-18 |           314.7 |            3.08 | 00:59:13     |  3.1 | West Boundary          |
    | 2018-06-20 |           338.5 |            3.27 | 01:03:42     |  3.1 | West Boundary          |
    | 2018-06-21 |           339.5 |            3.40 | 01:03:54     |  3.2 | West Boundary          |
    | 2018-06-24 |           392.4 |            3.76 | 01:13:51     |  3.1 | House-Power Line Route |
    | 2018-06-25 |           362.1 |            3.72 | 01:08:09     |  3.3 | West Boundary          |
    | 2018-06-26 |           380.5 |            3.94 | 01:11:36     |  3.3 | West Boundary          |
    | 2018-07-03 |           323.7 |            3.29 | 01:00:55     |  3.2 | West Boundary          |
    | 2018-07-04 |           342.8 |            3.47 | 01:04:31     |  3.2 | West Boundary          |
    | 2018-07-06 |           375.7 |            3.80 | 01:10:42     |  3.2 | West Boundary          |
    | 2018-07-07 |           347.6 |            3.40 | 01:05:25     |  3.1 | Sandy Trail-Drive      |
    | 2018-07-08 |           351.6 |            3.58 | 01:06:09     |  3.2 | West Boundary          |
    | 2018-07-09 |           336.0 |            3.28 | 01:03:13     |  3.1 | West Boundary          |
    | 2018-07-11 |           375.2 |            3.81 | 01:10:37     |  3.2 | West Boundary          |
    | 2018-07-12 |           325.9 |            3.28 | 01:01:20     |  3.2 | West Boundary          |
    | 2018-07-15 |           382.9 |            3.91 | 01:12:03     |  3.3 | House-Power Line Route |
    | 2018-07-16 |           368.6 |            3.72 | 01:09:22     |  3.2 | West Boundary          |
    | 2018-07-17 |           339.4 |            3.46 | 01:03:52     |  3.3 | West Boundary          |
    | 2018-07-18 |           368.1 |            3.72 | 01:08:28     |  3.3 | West Boundary          |
    | 2018-07-19 |           339.2 |            3.44 | 01:03:06     |  3.3 | West Boundary          |
    | 2018-07-22 |           378.3 |            3.76 | 01:10:22     |  3.2 | West Boundary          |
    | 2018-07-23 |           322.9 |            3.28 | 01:00:03     |  3.3 | West Boundary          |
    | 2018-07-24 |           386.4 |            3.81 | 01:11:53     |  3.2 | West Boundary          |
    | 2018-07-25 |           379.9 |            3.83 | 01:10:39     |  3.3 | West Boundary          |
    | 2018-07-27 |           378.3 |            3.73 | 01:10:21     |  3.2 | West Boundary          |
    | 2018-07-28 |           337.4 |            3.39 | 01:02:45     |  3.2 | Sandy Trail-Drive      |
    | 2018-07-29 |           348.7 |            3.50 | 01:04:52     |  3.2 | West Boundary          |
    | 2018-07-30 |           361.6 |            3.69 | 01:07:15     |  3.3 | West Boundary          |
    | 2018-07-31 |           359.9 |            3.66 | 01:06:57     |  3.3 | West Boundary          |
    | 2018-08-01 |           336.1 |            3.37 | 01:01:48     |  3.3 | West Boundary          |
    | 2018-08-03 |           259.9 |            2.57 | 00:47:47     |  3.2 | West Boundary          |
    | 2018-08-05 |           341.2 |            3.37 | 01:02:44     |  3.2 | West Boundary          |
    | 2018-08-06 |           357.7 |            3.64 | 01:05:46     |  3.3 | West Boundary          |
    | 2018-08-17 |           184.2 |            1.89 | 00:39:00     |  2.9 | Tree Trail-extended    |
    | 2018-08-18 |           242.9 |            2.53 | 00:51:25     |  3.0 | Tree Trail-extended    |
    | 2018-08-30 |           204.4 |            1.95 | 00:37:35     |  3.1 | House-Power Line Route |
    +------------+-----------------+-----------------+--------------+------+------------------------+
    40 rows in set (0.00 sec)

    最初に見るウィンドウ関数はROW_NUMBER()です。

    '7月'の月のburned_calories列で並べ替えられた結果セットが必要だとします。

    もちろん、このクエリでそのデータを取得できます:

    mysql> SELECT day_walked, burned_calories, trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE MONTHNAME(day_walked) = 'July'
        -> ORDER BY burned_calories DESC;
    +------------+-----------------+------------------------+
    | day_walked | burned_calories | trail_hiked            |
    +------------+-----------------+------------------------+
    | 2018-07-24 |           386.4 | West Boundary          |
    | 2018-07-15 |           382.9 | House-Power Line Route |
    | 2018-07-25 |           379.9 | West Boundary          |
    | 2018-07-22 |           378.3 | West Boundary          |
    | 2018-07-27 |           378.3 | West Boundary          |
    | 2018-07-06 |           375.7 | West Boundary          |
    | 2018-07-11 |           375.2 | West Boundary          |
    | 2018-07-16 |           368.6 | West Boundary          |
    | 2018-07-18 |           368.1 | West Boundary          |
    | 2018-07-30 |           361.6 | West Boundary          |
    | 2018-07-31 |           359.9 | West Boundary          |
    | 2018-07-08 |           351.6 | West Boundary          |
    | 2018-07-29 |           348.7 | West Boundary          |
    | 2018-07-07 |           347.6 | Sandy Trail-Drive      |
    | 2018-07-04 |           342.8 | West Boundary          |
    | 2018-07-17 |           339.4 | West Boundary          |
    | 2018-07-19 |           339.2 | West Boundary          |
    | 2018-07-28 |           337.4 | Sandy Trail-Drive      |
    | 2018-07-09 |           336.0 | West Boundary          |
    | 2018-07-12 |           325.9 | West Boundary          |
    | 2018-07-03 |           323.7 | West Boundary          |
    | 2018-07-23 |           322.9 | West Boundary          |
    +------------+-----------------+------------------------+
    22 rows in set (0.01 sec)

    それでも、何らかの理由(おそらく個人的な満足)で、私は受賞したいと思います ランキング 返された行の中で、burned_caloriesの数が最も多いことを示す1で始まり、結果セットの(n)行まで続きます。

    ROW_NUMBER()は、これをまったく問題なく処理できます:

    mysql> SELECT day_walked, burned_calories,
        -> ROW_NUMBER() OVER(ORDER BY burned_calories DESC)
        -> AS position, trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE MONTHNAME(day_walked) = 'July';
    +------------+-----------------+----------+------------------------+
    | day_walked | burned_calories | position | trail_hiked            |
    +------------+-----------------+----------+------------------------+
    | 2018-07-24 |           386.4 |        1 | West Boundary          |
    | 2018-07-15 |           382.9 |        2 | House-Power Line Route |
    | 2018-07-25 |           379.9 |        3 | West Boundary          |
    | 2018-07-22 |           378.3 |        4 | West Boundary          |
    | 2018-07-27 |           378.3 |        5 | West Boundary          |
    | 2018-07-06 |           375.7 |        6 | West Boundary          |
    | 2018-07-11 |           375.2 |        7 | West Boundary          |
    | 2018-07-16 |           368.6 |        8 | West Boundary          |
    | 2018-07-18 |           368.1 |        9 | West Boundary          |
    | 2018-07-30 |           361.6 |       10 | West Boundary          |
    | 2018-07-31 |           359.9 |       11 | West Boundary          |
    | 2018-07-08 |           351.6 |       12 | West Boundary          |
    | 2018-07-29 |           348.7 |       13 | West Boundary          |
    | 2018-07-07 |           347.6 |       14 | Sandy Trail-Drive      |
    | 2018-07-04 |           342.8 |       15 | West Boundary          |
    | 2018-07-17 |           339.4 |       16 | West Boundary          |
    | 2018-07-19 |           339.2 |       17 | West Boundary          |
    | 2018-07-28 |           337.4 |       18 | Sandy Trail-Drive      |
    | 2018-07-09 |           336.0 |       19 | West Boundary          |
    | 2018-07-12 |           325.9 |       20 | West Boundary          |
    | 2018-07-03 |           323.7 |       21 | West Boundary          |
    | 2018-07-23 |           322.9 |       22 | West Boundary          |
    +------------+-----------------+----------+------------------------+
    22 rows in set (0.00 sec)

    burned_caloriesの量が386.4の行には、位置があることがわかります。 1、値322.9の行には22があります。これは、返された行セットの中で最小(または最小)の量です。

    進行するにつれて、もう少し興味深いものにROW_NUMBER()を使用します。その文脈で使用されていることを知ったときだけ、私はその真の力の一部を本当に実感しました。

    次に、RANK()ウィンドウ関数にアクセスして、別の種類の'ランキングを提供しましょう。 '行の間。引き続きburned_calories列の値をターゲットにします。また、RANK()は行をいくらかランク付けするという点でROW_NUMBER()に似ていますが、特定の状況では微妙な違いがあります。

    「7月」の月ではなく、特定の証跡を対象とするレコードをフィルタリングすることで、全体としての行数をさらに制限します。

    mysql> SELECT day_walked, burned_calories,
        -> RANK() OVER(ORDER BY burned_calories DESC) AS position,
        -> trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE MONTHNAME(day_walked) = 'July'
        -> AND trail_hiked = 'West Boundary';
    +------------+-----------------+----------+---------------+
    | day_walked | burned_calories | position | trail_hiked   |
    +------------+-----------------+----------+---------------+
    | 2018-07-24 |           386.4 |        1 | West Boundary |
    | 2018-07-25 |           379.9 |        2 | West Boundary |
    | 2018-07-22 |           378.3 |        3 | West Boundary |
    | 2018-07-27 |           378.3 |        3 | West Boundary |
    | 2018-07-06 |           375.7 |        5 | West Boundary |
    | 2018-07-11 |           375.2 |        6 | West Boundary |
    | 2018-07-16 |           368.6 |        7 | West Boundary |
    | 2018-07-18 |           368.1 |        8 | West Boundary |
    | 2018-07-30 |           361.6 |        9 | West Boundary |
    | 2018-07-31 |           359.9 |       10 | West Boundary |
    | 2018-07-08 |           351.6 |       11 | West Boundary |
    | 2018-07-29 |           348.7 |       12 | West Boundary |
    | 2018-07-04 |           342.8 |       13 | West Boundary |
    | 2018-07-17 |           339.4 |       14 | West Boundary |
    | 2018-07-19 |           339.2 |       15 | West Boundary |
    | 2018-07-09 |           336.0 |       16 | West Boundary |
    | 2018-07-12 |           325.9 |       17 | West Boundary |
    | 2018-07-03 |           323.7 |       18 | West Boundary |
    | 2018-07-23 |           322.9 |       19 | West Boundary |
    +------------+-----------------+----------+---------------+
    19 rows in set (0.01 sec)

    ここで何か奇妙なことに気づきましたか? ROW_NUMBER()とは異なりますか?

    「2018-07-22」と「2018-07-27」の行の位置の値を確認してください。彼らは3位で同点です。

    両方の行に378.3のburned_calorie値が存在するため、正当な理由があります。

    ROW_NUMBER()はそれらをどのようにランク付けしますか?

    調べてみましょう:

    mysql> SELECT day_walked, burned_calories,
        -> ROW_NUMBER() OVER(ORDER BY burned_calories DESC) AS position,
        -> trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE MONTHNAME(day_walked) = 'July'
        -> AND trail_hiked = 'West Boundary';
    +------------+-----------------+----------+---------------+
    | day_walked | burned_calories | position | trail_hiked   |
    +------------+-----------------+----------+---------------+
    | 2018-07-24 |           386.4 |        1 | West Boundary |
    | 2018-07-25 |           379.9 |        2 | West Boundary |
    | 2018-07-22 |           378.3 |        3 | West Boundary |
    | 2018-07-27 |           378.3 |        4 | West Boundary |
    | 2018-07-06 |           375.7 |        5 | West Boundary |
    | 2018-07-11 |           375.2 |        6 | West Boundary |
    | 2018-07-16 |           368.6 |        7 | West Boundary |
    | 2018-07-18 |           368.1 |        8 | West Boundary |
    | 2018-07-30 |           361.6 |        9 | West Boundary |
    | 2018-07-31 |           359.9 |       10 | West Boundary |
    | 2018-07-08 |           351.6 |       11 | West Boundary |
    | 2018-07-29 |           348.7 |       12 | West Boundary |
    | 2018-07-04 |           342.8 |       13 | West Boundary |
    | 2018-07-17 |           339.4 |       14 | West Boundary |
    | 2018-07-19 |           339.2 |       15 | West Boundary |
    | 2018-07-09 |           336.0 |       16 | West Boundary |
    | 2018-07-12 |           325.9 |       17 | West Boundary |
    | 2018-07-03 |           323.7 |       18 | West Boundary |
    | 2018-07-23 |           322.9 |       19 | West Boundary |
    +------------+-----------------+----------+---------------+
    19 rows in set (0.06 sec)

    うーん...

    今回は、ポジション列の番号付けに関係はありません。

    しかし、誰が優先されますか?

    私の知る限り、予測可能な順序については、クエリ内の他の追加の手段(この場合はtime_walking列など)によって決定する必要があります。

    しかし、ランキングオプションはまだ完成していません。これがDENSE_RANK()です:

    mysql> SELECT day_walked, burned_calories,
        -> DENSE_RANK() OVER(ORDER BY burned_calories DESC) AS position,
        -> trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE MONTHNAME(day_walked) = 'July'
        -> AND trail_hiked = 'West Boundary';
    +------------+-----------------+----------+---------------+
    | day_walked | burned_calories | position | trail_hiked   |
    +------------+-----------------+----------+---------------+
    | 2018-07-24 |           386.4 |        1 | West Boundary |
    | 2018-07-25 |           379.9 |        2 | West Boundary |
    | 2018-07-22 |           378.3 |        3 | West Boundary |
    | 2018-07-27 |           378.3 |        3 | West Boundary |
    | 2018-07-06 |           375.7 |        4 | West Boundary |
    | 2018-07-11 |           375.2 |        5 | West Boundary |
    | 2018-07-16 |           368.6 |        6 | West Boundary |
    | 2018-07-18 |           368.1 |        7 | West Boundary |
    | 2018-07-30 |           361.6 |        8 | West Boundary |
    | 2018-07-31 |           359.9 |        9 | West Boundary |
    | 2018-07-08 |           351.6 |       10 | West Boundary |
    | 2018-07-29 |           348.7 |       11 | West Boundary |
    | 2018-07-04 |           342.8 |       12 | West Boundary |
    | 2018-07-17 |           339.4 |       13 | West Boundary |
    | 2018-07-19 |           339.2 |       14 | West Boundary |
    | 2018-07-09 |           336.0 |       15 | West Boundary |
    | 2018-07-12 |           325.9 |       16 | West Boundary |
    | 2018-07-03 |           323.7 |       17 | West Boundary |
    | 2018-07-23 |           322.9 |       18 | West Boundary |
    +------------+-----------------+----------+---------------+
    19 rows in set (0.00 sec)

    同点は残りますが、行がカウントされる場所では番号が異なります。 、残りの結果を続行します。

    RANK()が同点の後に5でカウントを開始した場合、同点は3行目で発生したため、DENSE_RANK()は次の番号(この例では4)を取得します。

    私が最初に認めます。これらのさまざまな行ランキングパターンは非常に興味深いものですが、意味のある結果セットにどのように使用できますか?

    データベースインフラストラクチャ全体のClusterControlSingleコンソールClusterControlのその他の新機能を確認するClusterControlを無料でインストール

    ボーナス思考

    クレジットが必要な場合はクレジットを付与する必要があります。 YouTubeのすばらしいシリーズからウィンドウ関数について多くを学び、特に1つのビデオから、この次の例に刺激を受けました。そのシリーズの例は非オープンソースデータベースで示されていますが、覚えておいてください。 システム(デジタルの腐った果物や野菜を私に投げつけないでください)、ビデオ全体から学ぶことがたくさんあります。

    これまでのところ、調査したいほとんどのクエリ結果にパターンが見られます。月や証跡でフィルタリングすることはありません。

    私が知りたいのは、350カロリー以上を消費した連続した日です。さらに良いことに、当時のグループ。

    これが私が始めて構築する基本的なクエリです:

    mysql> SELECT day_walked, burned_calories, 
        -> ROW_NUMBER() OVER(ORDER BY day_walked ASC) AS positional_bound, 
        -> trail_hiked 
        -> FROM vw_fav_shoe_stats 
        -> WHERE burned_calories > 350;
    +------------+-----------------+------------------+------------------------+
    | day_walked | burned_calories | positional_bound | trail_hiked            |
    +------------+-----------------+------------------+------------------------+
    | 2018-06-03 |           389.6 |                1 | Sandy Trail-Drive      |
    | 2018-06-04 |           394.6 |                2 | Sandy Trail-Drive      |
    | 2018-06-06 |           384.6 |                3 | Sandy Trail-Drive      |
    | 2018-06-07 |           382.7 |                4 | Sandy Trail-Drive      |
    | 2018-06-24 |           392.4 |                5 | House-Power Line Route |
    | 2018-06-25 |           362.1 |                6 | West Boundary          |
    | 2018-06-26 |           380.5 |                7 | West Boundary          |
    | 2018-07-06 |           375.7 |                8 | West Boundary          |
    | 2018-07-08 |           351.6 |                9 | West Boundary          |
    | 2018-07-11 |           375.2 |               10 | West Boundary          |
    | 2018-07-15 |           382.9 |               11 | House-Power Line Route |
    | 2018-07-16 |           368.6 |               12 | West Boundary          |
    | 2018-07-18 |           368.1 |               13 | West Boundary          |
    | 2018-07-22 |           378.3 |               14 | West Boundary          |
    | 2018-07-24 |           386.4 |               15 | West Boundary          |
    | 2018-07-25 |           379.9 |               16 | West Boundary          |
    | 2018-07-27 |           378.3 |               17 | West Boundary          |
    | 2018-07-30 |           361.6 |               18 | West Boundary          |
    | 2018-07-31 |           359.9 |               19 | West Boundary          |
    | 2018-08-06 |           357.7 |               20 | West Boundary          |
    +------------+-----------------+------------------+------------------------+
    20 rows in set (0.00 sec)

    ROW_NUMBER()はすでに見てきましたが、今では実際に機能します。

    これを機能させるには(少なくともMySQLでは)DATE_SUB()関数を使用する必要がありました。これは、基本的に、この手法では、同じ行のday_walked日付列からROW_NUMBER()によって提供される値を減算するためです。ターン、計算を介して日付自体を提供します:

    mysql> SELECT day_walked AS day_of_walk,
        -> DATE_SUB(day_walked, INTERVAL ROW_NUMBER() OVER(ORDER BY day_walked ASC) DAY) AS positional_bound,
        -> burned_calories,
        -> trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE burned_calories > 350;
    +-------------+------------------+-----------------+------------------------+
    | day_of_walk | positional_bound | burned_calories | trail_hiked            |
    +-------------+------------------+-----------------+------------------------+
    | 2018-06-03  | 2018-06-02       |           389.6 | Sandy Trail-Drive      |
    | 2018-06-04  | 2018-06-02       |           394.6 | Sandy Trail-Drive      |
    | 2018-06-06  | 2018-06-03       |           384.6 | Sandy Trail-Drive      |
    | 2018-06-07  | 2018-06-03       |           382.7 | Sandy Trail-Drive      |
    | 2018-06-24  | 2018-06-19       |           392.4 | House-Power Line Route |
    | 2018-06-25  | 2018-06-19       |           362.1 | West Boundary          |
    | 2018-06-26  | 2018-06-19       |           380.5 | West Boundary          |
    | 2018-07-06  | 2018-06-28       |           375.7 | West Boundary          |
    | 2018-07-08  | 2018-06-29       |           351.6 | West Boundary          |
    | 2018-07-11  | 2018-07-01       |           375.2 | West Boundary          |
    | 2018-07-15  | 2018-07-04       |           382.9 | House-Power Line Route |
    | 2018-07-16  | 2018-07-04       |           368.6 | West Boundary          |
    | 2018-07-18  | 2018-07-05       |           368.1 | West Boundary          |
    | 2018-07-22  | 2018-07-08       |           378.3 | West Boundary          |
    | 2018-07-24  | 2018-07-09       |           386.4 | West Boundary          |
    | 2018-07-25  | 2018-07-09       |           379.9 | West Boundary          |
    | 2018-07-27  | 2018-07-10       |           378.3 | West Boundary          |
    | 2018-07-30  | 2018-07-12       |           361.6 | West Boundary          |
    | 2018-07-31  | 2018-07-12       |           359.9 | West Boundary          |
    | 2018-08-06  | 2018-07-17       |           357.7 | West Boundary          |
    +-------------+------------------+-----------------+------------------------+
    20 rows in set (0.00 sec)

    ただし、DATE_SUB()がないと、これで終わります(または少なくとも私はそうしました):

    mysql> SELECT day_walked AS day_of_walk,
        -> day_walked - ROW_NUMBER() OVER(ORDER BY day_walked ASC) AS positional_bound,
        -> burned_calories,
        -> trail_hiked
        -> FROM vw_fav_shoe_stats
        -> WHERE burned_calories > 350;
    +-------------+------------------+-----------------+------------------------+
    | day_of_walk | positional_bound | burned_calories | trail_hiked            |
    +-------------+------------------+-----------------+------------------------+
    | 2018-06-03  |         20180602 |           389.6 | Sandy Trail-Drive      |
    | 2018-06-04  |         20180602 |           394.6 | Sandy Trail-Drive      |
    | 2018-06-06  |         20180603 |           384.6 | Sandy Trail-Drive      |
    | 2018-06-07  |         20180603 |           382.7 | Sandy Trail-Drive      |
    | 2018-06-24  |         20180619 |           392.4 | House-Power Line Route |
    | 2018-06-25  |         20180619 |           362.1 | West Boundary          |
    | 2018-06-26  |         20180619 |           380.5 | West Boundary          |
    | 2018-07-06  |         20180698 |           375.7 | West Boundary          |
    | 2018-07-08  |         20180699 |           351.6 | West Boundary          |
    | 2018-07-11  |         20180701 |           375.2 | West Boundary          |
    | 2018-07-15  |         20180704 |           382.9 | House-Power Line Route |
    | 2018-07-16  |         20180704 |           368.6 | West Boundary          |
    | 2018-07-18  |         20180705 |           368.1 | West Boundary          |
    | 2018-07-22  |         20180708 |           378.3 | West Boundary          |
    | 2018-07-24  |         20180709 |           386.4 | West Boundary          |
    | 2018-07-25  |         20180709 |           379.9 | West Boundary          |
    | 2018-07-27  |         20180710 |           378.3 | West Boundary          |
    | 2018-07-30  |         20180712 |           361.6 | West Boundary          |
    | 2018-07-31  |         20180712 |           359.9 | West Boundary          |
    | 2018-08-06  |         20180786 |           357.7 | West Boundary          |
    +-------------+------------------+-----------------+------------------------+
    20 rows in set (0.04 sec)

    ねえ、それはそれほど悪くはないようです。

    何が得られますか?

    ええと、positional_bound値が「20180698」の行...

    ちょっと待ってください。これは、day_of_walk列からROW_NUMBER()が提供する数値を引くことによって日付値を計算することになっています。

    正解です。

    あなたのことはわかりませんが、98日で1か月はわかりません!

    ただし、ある場合は、追加の給与を持参してください!

    楽しいことはさておき、これは明らかに正しくなく、(最終的には)DATE_SUB()を使用するように促されました。これにより、正しい結果セットが提供され、このクエリを実行できるようになります。

    mysql> SELECT MIN(t.day_of_walk), 
        -> MAX(t.day_of_walk),
        -> COUNT(*) AS num_of_hikes
        -> FROM (SELECT day_walked AS day_of_walk,
        -> DATE_SUB(day_walked, INTERVAL ROW_NUMBER() OVER(ORDER BY day_walked ASC) DAY) AS positional_bound
        -> FROM vw_fav_shoe_stats
        -> WHERE burned_calories > 350) AS t
        -> GROUP BY t.positional_bound
        -> ORDER BY 1;
    +--------------------+--------------------+--------------+
    | MIN(t.day_of_walk) | MAX(t.day_of_walk) | num_of_hikes |
    +--------------------+--------------------+--------------+
    | 2018-06-03         | 2018-06-04         |            2 |
    | 2018-06-06         | 2018-06-07         |            2 |
    | 2018-06-24         | 2018-06-26         |            3 |
    | 2018-07-06         | 2018-07-06         |            1 |
    | 2018-07-08         | 2018-07-08         |            1 |
    | 2018-07-11         | 2018-07-11         |            1 |
    | 2018-07-15         | 2018-07-16         |            2 |
    | 2018-07-18         | 2018-07-18         |            1 |
    | 2018-07-22         | 2018-07-22         |            1 |
    | 2018-07-24         | 2018-07-25         |            2 |
    | 2018-07-27         | 2018-07-27         |            1 |
    | 2018-07-30         | 2018-07-31         |            2 |
    | 2018-08-06         | 2018-08-06         |            1 |
    +--------------------+--------------------+--------------+
    13 rows in set (0.12 sec)
    関連リソース2018年のMySQLMySQLのClusterControl:8.0の内容とその他の所見MySQLパフォーマンスベンチマーク:MySQL5.7とMySQL8.0

    基本的に、私はラップしました その分析クエリから派生テーブルの形式で提供された結果セットは、開始日と終了日、num_of_hikesとラベル付けしたものの数をクエリし、positional_bound列にグループ化して、最終的に次のグループのセットを提供します。 350カロリー以上を消費した連続した日。

    2018年6月24日から2018年6月26日までの日付範囲で、WHERE句の350の消費カロリー基準を満たす3日間の連続結果を確認できます。

    自分で言わなくても悪くないですが、絶対に頑張りたいレコードです!

    結論

    ウィンドウ関数は、独自の世界とリーグにあります。私はそれらの表面を傷つけたことさえありません。「ハイレベル」でそれらのうちの3つだけをカバーしました。 '入門的で、おそらく些細な意味。ただし、うまくいけば、この投稿を通じて、非常に興味深く、潜在的に洞察に満ちたデータを「最小限のデータ」でクエリできることがわかります。 'それらの使用。

    読んでいただきありがとうございます。


    1. AccessでSQLServerを使用する必要があるのはいつですか。 (ヒント:ほとんどの場合)

    2. MySQLレプリケーションとGTIDベースのフェイルオーバー-誤ったトランザクションの詳細

    3. SQL Group BY、各グループの上位N項目

    4. MS-Accessの基本クラスと派生オブジェクト