2015-11-02 54 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

的事实。对不起,你可以在小提琴中看到工作正常。我建议你从最内在的选择开始,并开始添加代码部分。我的猜测可能是我创建别名的方式,但看起来非常基本的代码。祝你好运 –