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 重复这个过程。

4

1 回答 1

1

使用这个定义

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

SqlFiddle 演示

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

输出

|   id | cost |
|------|------|
| 1667 |   20 |
| 2000 |   25 |
| 3244 |   26 |
| 3814 |   13 |
| 9999 |   56 |
于 2015-11-02T14:23:59.270 回答