一連のデータの中央値 (特定の地域または特定の企業の収入の中央値など) を取得するには、通常、このタスクを 3 つの小さなタスクに細分する必要があります:
1 。データを作成し、データの各行に全データの中での順位を与えます;
2. 順位の中央値を見つけます;
3. 対応する中間順位を見つけます;
の値以下では、企業の従業員の月収を例として、いくつかの複雑な MySQL ステートメントの使用法を説明します。
方法 1
テスト テーブルの作成
最初に収入テーブルを作成します。テーブル作成ステートメントは次のとおりです。
CREATE TABLE IF NOT EXISTS `employee` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(10) NOT NULL DEFAULT '', `income` INT NOT NULL DEFAULT '0' ) ENGINE = InnoDB DEFAULT CHARSET = utf8; INSERT INTO `employee` (`name`, `income`) VALUES ('麻子', 20000); INSERT INTO `employee` (`name`, `income`) VALUES ('李四', 12000); INSERT INTO `employee` (`name`, `income`) VALUES ('张三', 10000); INSERT INTO `employee` (`name`, `income`) VALUES ('王二', 16000); INSERT INTO `employee` (`name`, `income`) VALUES ('土豪', 40000);
タスク 1
データを並べ替え、データの各行に全データの中での順位を付けます:
SELECT t1.name, t1.income, COUNT(*) AS rank FROM employee AS t1, employee AS t2 WHERE t1.income < t2.income OR (t1.income = t2.income AND t1.name <= t2.name) GROUP BY t1.name, t1.income ORDER BY rank;
クエリ結果は次のとおりです:
小さなタスク 2
順位の中央値を見つける:
SELECT (COUNT(*) + 1) DIV 2 as rank FROM employee;
クエリの結果は次のとおりです:
小さなタスク 3
SELECT income AS median FROM (SELECT t1.name, t1.income, COUNT(*) AS rank FROM employee AS t1, employee AS t2 WHERE t1.income < t2.income OR (t1.income = t2.income AND t1.name <= t2.name) GROUP BY t1.name, t1.income ORDER BY rank) t3 WHERE rank = (SELECT (COUNT(*) + 1) DIV 2 FROM employee)
クエリの結果は次のとおりです:
# ここではつまり、一連のデータから中央値を取得する方法がわかりました。
方法 2
次に、ランキング ステートメントを最適化する別の方法を紹介します。
データ セットを並べ替える方法は誰もが知っています。この例では、実装方法は次のとおりです:
SELECT name, income FROM employee ORDER BY income DESC
クエリ結果は次のとおりです:
##さらに一歩進んで、クエリ結果に列を追加できますか? この列のデータはランキングですか? この目標は、3 つのカスタム変数によって達成できます。 最初の変数は、データの現在の行の収入を記録するために使用されます。2 番目の変数は、データの現在の行の収入を記録するために使用されます。データの前の行の収入3 番目の変数は、データの現在の行のランキングを記録するために使用されますSET @curr_income := 0; SET @prev_income := 0; SET @rank := 0; SELECT `name`, @curr_income := income AS income, @rank := if(@prev_income != @curr_income, @rank + 1, @rank) AS rank, @prev_income := @curr_income AS dummy FROM employee ORDER BY income DESC
##次に、中央値のランキング番号を見つけて、さらに収入の中央値を調べます:
SET @curr_income := 0; SET @prev_income := 0; SET @rank := 0; SELECT income AS median FROM (SELECT `name`, @curr_income := income AS income, @rank := if(@prev_income != @curr_income, @rank + 1, @rank) AS rank, @prev_income := @curr_income AS dummy FROM employee ORDER BY income DESC) AS t1 WHERE t1.rank = (SELECT (COUNT(*) + 1) DIV 2 FROM employee)
クエリ結果は次のようになります:
# #この時点で、中央値の問題を解決する 2 つの方法が見つかりました。花を散らします。推奨: 「
mysql チュートリアル」
以上がMySQL でデータセットの中央値を計算する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。