通过应用特定过滤器查询和分组数据

时间:2015-11-02 13:44:49

标签: mysql sql aggregate-functions firebird1.5

我有下表(仅样本),其中包含特定项目的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或数字太高。

  • 首先,我想排除所有ID为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重复这个过程。

1 个答案:

答案 0 :(得分:1)

使用此definition

  

对于一组数据,75%的数据小于的数字   那个数字。第三个四分位数与部分的中位数相同   数据大于中位数。与第75百分位相同。

<强> 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 |