テーブルの実際のテーブル説明を提供していないためです。私の答えでWorker
は、COMPANY
データベースで a を使用しています:
私のテーブルには、あなたとWorker
同様に 3 つの給与フィールドがあります。実際の説明は次のとおりです。 field1
field2
field3
mysql> DESC `Worker`;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | | NULL | |
| name | varchar(64) | YES | | NULL | |
| salary1 | int(11) | YES | | NULL | |
| salary2 | int(11) | YES | | NULL | |
| salary3 | int(11) | YES | | NULL | |
| Date | int(11) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
このテーブルでは、整数として追加しました ( MySQL で Date
実際のデータ型を使用できます)。
テーブルに次のタプルがあるとします。
mysql> SELECT * FROM `Worker` ORDER BY `Date` ASC ;
+-----+---------+---------+---------+---------+------+
| SSN | name | salary1 | salary2 | salary3 | Date |
+-----+---------+---------+---------+---------+------+
| 3 | Sumit | 250 | 150 | 100 | 2 |
| 4 | Harsh | 500 | -150 | 900 | 2 |
| 5 | ONE | 100 | 170 | 100 | 9 |
| 2 | Rahul | 300 | 15 | 30 | 10 |
| 1 | Grijesh | 200 | 100 | 50 | 13 |
| 7 | THREE | 1000 | 17 | -200 | 21 |
| 6 | TWO | 50 | -170 | 200 | 27 |
+-----+---------+---------+---------+---------+------+
上記のクエリの ASC オーダー ショー、私が言ったように日付はタイプです
給与の合計がそれを超えているすべての古いワーカーを削除する必要があるとしますN
(N
あなたの場合、TOTのしきい値のようなものです)。年配の労働者を選択するにはWorker
、テーブルを同意 ( ASC ) 順にソートする必要がありました。
労働者の入社日として想定できる日。入社年月日によるとかなり古いというのが経験です
選択クエリを作成する前に、いくつかの結果を示します。
mysql> SELECT * , `salary1` + `salary2` + `salary3` AS TSalary
-> FROM `Worker` ORDER BY DATE ASC ;
+-----+---------+---------+---------+---------+------+---------+
| SSN | name | salary1 | salary2 | salary3 | Date | TSalary |
+-----+---------+---------+---------+---------+------+---------+
| 3 | Sumit | 250 | 150 | 100 | 2 | 500 |
| 4 | Harsh | 500 | -150 | 900 | 2 | 1250 |
| 5 | ONE | 100 | 170 | 100 | 9 | 370 |
| 2 | Rahul | 300 | 15 | 30 | 10 | 345 |
| 1 | Grijesh | 200 | 100 | 50 | 13 | 350 |
| 7 | THREE | 1000 | 17 | -200 | 21 | 817 |
| 6 | TWO | 50 | -170 | 200 | 27 | 80 |
+-----+---------+---------+---------+---------+------+---------+
7 rows in set (0.01 sec)
TSalary
salary1
は、 、salary2
&の 3 つのコンポーネントの合計である、労働者が雇用として得る総給与ですsalary3
(上記のクエリに示されているように)
各レベルでの給与の合計はいくらですか (表の各サブセットについて):
+-----+---------+---------+---------+---------+------+---------+
| SSN | name | salary1 | salary2 | salary3 | Date | TSalary | SUM(TSalary) at
+-----+---------+---------+---------+---------+------+---------+ each level
| 3 | Sumit | 250 | 150 | 100 | 2 | 500 |500
| 4 | Harsh | 500 | -150 | 900 | 2 | 1250 |500 + 1250= 1750
| 5 | ONE | 100 | 170 | 100 | 9 | 370 |1750 + 370= 2120
| 2 | Rahul | 300 | 15 | 30 | 10 | 345 |2120 + 345= 2465
| 1 | Grijesh | 200 | 100 | 50 | 13 | 350 |2465 + 350= 2815
| 7 | THREE | 1000 | 17 | -200 | 21 | 817 |2815 + 817= 3632
| 6 | TWO | 50 | -170 | 200 | 27 | 80 |3632 + 80 = 3712
+-----+---------+---------+---------+---------+------+---------+
そして、給与の合計を持つ古い労働者を選択するためのクエリを作成しました<= N
。
N = 1500
以下は例です:(上記で計算したように、2行を選択する必要があると思います)
SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3`
FROM ( SELECT `ssn`,
`name`,
`salary1` ,
`salary2` ,
`salary3`,
(@total:=@total+ `salary1` + `salary2` + `salary3`) as TSalary
FROM `Worker`, (select @total:=0) t
ORDER BY `Date` ASC ) AS `some_worker`
WHERE (TSalary -(`salary1` + `salary2` + `salary3`)) <= 1500;
+-----+-------+---------+---------+---------+
| ssn | name | salary1 | salary2 | salary3 |
+-----+-------+---------+---------+---------+
| 3 | Sumit | 250 | 150 | 100 |
| 4 | Harsh | 500 | -150 | 900 |
+-----+-------+---------+---------+---------+
2 rows in set (0.00 sec)
注意: 3 番目を含めると N (= 1500) を超えることになるため、2 つだけが選択されます。
N = 2000
:(上記で計算したように、2行を選択する必要があると思います)
SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3`
FROM ( SELECT `ssn`,
`name`,
`salary1` ,
`salary2` ,
`salary3`,
(@total:=@total+ `salary1` + `salary2` + `salary3`) as TSalary
FROM `Worker`, (select @total:=0) t
ORDER BY `Date` ASC ) AS `some_worker`
WHERE (TSalary -(`salary1` + `salary2` + `salary3`)) <= 2000;
+-----+-------+---------+---------+---------+
| ssn | name | salary1 | salary2 | salary3 |
+-----+-------+---------+---------+---------+
| 3 | Sumit | 250 | 150 | 100 |
| 4 | Harsh | 500 | -150 | 900 |
+-----+-------+---------+---------+---------+
| 5 | ONE | 100 | 170 | 100 |
+-----+-------+---------+---------+---------+
3 rows in set (0.00 sec)
このクエリはこの例では正常に機能しますが、長いテーブルの場合は正常に機能する可能性がありますが、これが作業を完了する 1 つの方法です。
試してみる!!
また、必要に応じて外部条件の等価条件を変更することもできます (しきい値の定義について少し混乱しています。例を挙げて質問すると良いかもしれません)。