PARTITION BY
MySQLのような分析関数を探しています(詳細については、ドキュメントを参照してください)
分析関数は、行のグループに基づいて集計値を計算します。これらは、グループごとに複数の行を返すという点で集計関数とは異なります。
それは存在しますか?
MySQLの変数を使用して分析関数を模倣できることを伝えたかっただけです。たとえば、SUMOVERは次のように実行できます。
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
必要に応じてPARTITION BY
、それは可能ですが、もう少し複雑です。基本的に、アカウント(またはパーティション分割するもの)を監視するために別のアカウントを追加@variable
し、アカウント(または変数)で並べ替えてから@sum
、アカウントが変更されたときにリセットします。次のように:
SELECT account,
amount,
(case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
(case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a
パーティション効果を実現するために実行する必要があった2つの主要な変更に注意してください。
メインテーブル( )は、句tbl
付きのサブ選択に含まれています。ORDER BY
これが必要なのは、MySQLが@account
変数テストを実行するときに、値がすでに順序付けられている必要があるためです。これが行われなかった場合、アカウント値だけでなく、誤った合計値も取得されます。
エイリアスされた「extra」列がありますas _
。結果を使用する場合はこの列を無視できますが、チェックと変更の順序は@account
チェックと変更の後である必要が@sum
あります。
また、これを使用すると、アカウントが最後であることを気にしない場合は、列を並べ替えることを選択できます。account
これは、最初の列が最後の列と重複しているため、最初の列を取り出して_
、エイリアスの名前を明らかに変更する_
ことによって行われaccount
ます。
資力:
いいえ、MSSQL、Oracle、PostgreSQLなどの他のDBMSと比較して、MySQLの主な欠如の1つです。特にOracleがMySQLを買収した後は、MySQLでウィンドウ関数が表示されることを強く疑っています...
2018年4月更新
MySQL8.0はウィンドウ関数をサポートするようになりました。
MySQLは分析関数をサポートしていませんが、MariaDBはサポートしています。これはMySQLのドロップイン代替品であり、MySQLの元の開発者によって作成されています。
データベース内の分析機能を提供するSQLServerの商用製品があり、「リンクサーバー」/odbcを介してOracleまたはMySQLデータベースに接続できます。これについて説明している記事は次のとおりです 。http ://westclintech.com/Blog /tabid/132/EntryId/88/Using-XLeratorDB-with-MySQL-and-other-RDBMS-s.aspx
これには、Windows o/sおよびSQLServer2005以降(Expressバージョンは無料)が必要です。