我有下表(仅样本),其中包含特定项目的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 = 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重复这个过程。
答案 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 |