2013-01-23 23 views
2

MySQL 5.0的表中,我希望刪除最舊的記錄,直到某些數字字段的SUM達到某個值 TOT(一些門檻)。如何刪除所有最老的記錄,直到某些數字字段的SUM達到某個值(TOT)

我在表中具有以下字段:

ID, field0 (varchar), field1 (INT), field2 (INT), field3 (int), date 

我需要一個查詢來選擇所有的最古老的記錄,直到和值(TOT)達到

SELECT ID, SUM(field1,field2,field3) as TOT 
    WHERE field0 = '$username' .... ORDER BY date ASC 

的目的:刪除較舊的記錄,直到3個數字字段的SUM達到某個值TOT。

任何提示? 感謝

+0

有什麼'SUM的性質(field1,field2,field3)'跨日期記錄? – SparKot

+0

查看本[問題:查詢:工資總額> 500的所有員工](http://dba.stackexchange.com/questions/33497/query-all-employee-with-sum-of-salary-500) –

回答

0

這是貫徹落實stored procedure

  1. 你可以得到的總記錄集的地方,
  2. 按id訂購或嵌日期和
  3. 不斷總結領域,直到你打你的目標總計,然後
  4. 在您的訂購清單中取最新的,並且
  5. 刪除該範圍之外的所有內容。
0

可以計算累積總和是這樣的:

SELECT ID, 
     (select SUM(field1 + field2 + field3) from t t2 where t2.date <= t.date and t2.field0 = tempdb.field0) as cumsum 
from t 
WHERE field0 = '$username' 

我想在MySQL中下列作品做刪除:

delete from t 
where t.id in (select id 
       from (SELECT ID, 
          (select SUM(field1 + field2 + field3) from t t2 where t2.date <= t.date and t2.field0 = tempdb.field0) as cumsum 
        from t 
        WHERE field0 = '$username' 
        ) tsum 
       where cumsum <= YOURTHRESHOLD 
      ) 

MySQL是挑剔自己加入在delete聲明。我認爲double子查詢修復了這個問題。

注意:此代碼未經測試,因此可能包含語法錯誤。

0

因爲你沒有給你實際的表格描述你的表格。在我的答案我在我的COMPANY數據庫使用Worker

在我Worker表我有三個薪金領域同樣你field1field2 & 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) 

在這個表,我添加Date爲整數(你可以有實際數據類型在MySQL中可用)。

假設表具有下列元組:在上面的查詢

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順序顯示,日期是在類型我說

想我需要刪除所有工人的他們的工資總和只不過是NN就像您的案例中的閾值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是tatal工資工人得到他的工作就是三個總和的salary1部件,salary2 & 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是例如低於:(如我計算上述我想兩個行應該選擇

SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3` 
FROM (SELECT `ssn`, 
       `name`, 
       `salary1` , 
       `salary2` , 
       `salary3`, 
       (@total:[email protected]+ `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) 

通知:只有兩個選擇,因爲包括第三裝置比N(=多1500) 。

現在假設N = 2000 :(,正如我上面所計算我想兩個行應選擇

SELECT `ssn`, `name`, `salary1` , `salary2` , `salary3` 
FROM (SELECT `ssn`, 
       `name`, 
       `salary1` , 
       `salary2` , 
       `salary3`, 
       (@total:[email protected]+ `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) 

此查詢工作正常在這個例子中,但可能是應爲長條桌,但這種單向你完成了你的工作。

試試吧!

另外,你的願望,你可以改變平等的條件外狀態(我對你的門限的定義有點混亂。如果你用一個例子問這可能是件好事)

相關問題