2015-11-02 49 views
0

我已經含有特定項目的ID和整個的一定時間內其相應的生產成本下表(只樣品)(在這種情況下被省略) 查詢和通過施加一個特定的濾波器

| id | cost| 
|------|-----| 
| 1667 | 20 | 
| 2000 | 25 | 
| 2000 | 30 | 
| 1667 | 35 | 
| 3244 | 500 | 
| 3244 | 0 | 
| 3244 | 25 | 
| 3244 | 26 | 
| 9999 | 56 | 
| 3814 | 526 | 
| 9999 | 699 | 
| 3814 | 13 | 
分組數據

我想提取每個特定ID的最大值,到目前爲止我已經成功。輸出看起來像這樣:

| id | cost | 
|------|-------| 
| 2000 | 30 | 
| 1667 | 35 | 
| 3244 | 500 | 
| 3814 | 526 | 
| 9999 | 699 | 

我使用的代碼是:

SELECT * 
FROM t1 WHERE (id,cost) IN 
(SELECT id, max(cost) 
FROM t1 
GROUP BY id 
) 

不過,我想獲得最大價值,因爲有時成本爲0或進入之前應用額外的過濾器數字太高。

  • 首先,我想排除價格= 0的所有ID。
  • 其次,我想排除高於特定ID的2x3rd四分位數的所有價格。

例如,如果我們把ID = 3244,過程是這樣的:

| id | cost |  | id | cost |  | id | cost | 
|------|-------|  |------|-------|  |------|-------| 
| 3244 | 500|  | 3244 | 500|  |  |  | 
| 3244 |  0|  |  |  |  |  |  | 
| 3244 |  25|  | 3244 |  25|  | 3244 |  25| 
| 3244 |  26|  | 3244 |  26|  | 3244 |  26| 

我會得到ID = 3244將是26號,我想重複這個過程每個ID。

+2

你能告訴什麼是2x3rd四分位 – Shankar

+0

通過聲明** ID的第三四分位數**你的意思是一個'ID = 1234'第三四分位數將是'3' – RiggsFolly

+0

@Shankar我的意思是,如果特定的行值比第三四分位數高兩倍,我希望查詢排除它,即id = 3244的第三四分位數是263(不包括0); 500> 263因此排除500. –

回答

1

使用這種definition

For a set of data, a number for which 75% of the data is less than that number. The third quartile is the same as the median of the part of the data which is greater than the median. Same as 75th percentile.

SqlFiddle Demo

SELECT item.id, MAX(cost) cost 
FROM item 
JOIN (
     SELECT item.id, avg(cost) thirdQ 
     FROM item 
     JOIN (
       SELECT id, avg(cost) mean_cost 
       FROM item 
       WHERE cost <> 0 
       GROUP BY id 
      ) T1 
     ON item.id = T1.id 
     WHERE cost > mean_cost and cost <> 0 
     GROUP BY item.id 
    ) T2 
    ON item.id = T2.id 
WHERE cost < T2.thirdQ 
GROUP BY item.id 

OUPUT

| id | cost | 
|------|------| 
| 1667 | 20 | 
| 2000 | 25 | 
| 3244 | 26 | 
| 3814 | 13 | 
| 9999 | 56 | 
+0

你好,謝謝你的代碼。我嘗試過,但我遇到了以下錯誤: '無效令牌動態SQL錯誤。 SQL錯誤代碼= -104。令牌未知 - 第4行,字符7. SELECT.' 也許這是由於我限制使用Firebird 1.5 –

+0

的事實。對不起,你可以在小提琴中看到工作正常。我建議你從最內在的選擇開始,並開始添加代碼部分。我的猜測可能是我創建別名的方式,但看起來非常基本的代碼。祝你好運 –