如何编写选择合理取舍的查询?

问题描述

| 在一个表中,我有两列obs和abd。我有兴趣寻找 obs和abd的值都较低,但abd的值较低 比对obs的低价值重要。在现实世界中,我有一个 低obs和低abd之间的权衡不容易定义 数学上很难解释,但重点是 我想从查询中看到的是一些数据 合理的权衡。我想知道一个 obs值范围。例如:
MysqL> select obs,abd from flow where obs < 2000 order by abd,obs limit 10;

    +------+--------------+
    | obs  | abd          |
    +------+--------------+
    | 1372 | 0.0000004744 |
    | 1734 | 0.0000017704 |
    | 1010 | 0.0000017716 |
    | 1999 | 0.0000017716 |
    | 1637 | 0.0000036486 |
    |  383 | 0.0000066084 |
    |  745 | 0.0000066084 |
    | 1107 | 0.0000066084 |
    | 1469 | 0.0000066084 |
    | 1831 | 0.0000066084 |
    +------+--------------+
从以上结果可以看出,存在多个值 具有相同abd值的Obs。我只对一个感兴趣 每个Abd值的obs值最低。所有其他的 重复的abd值应丢弃。这很容易做到 使用group by子句:
MysqL> select obs,abd from flow where obs < 2000 group by abd order by abd,obs limit 10;

    +------+--------------+
    | obs  | abd          |
    +------+--------------+
    | 1372 | 0.0000004744 |
    | 1734 | 0.0000017704 |
    | 1010 | 0.0000017716 |
    | 1637 | 0.0000036486 |
    |  383 | 0.0000066084 |
    |  648 | 0.0000066096 |
    | 1540 | 0.0000097586 |
    | 1928 | 0.0000109544 |
    | 1566 | 0.0000119724 |
    |  913 | 0.0000119736 |
    +------+--------------+
到目前为止,一切都很好。现在的问题是,看到第一个 obs是1372而abd是0.0000004744的条目我不感兴趣 看到obs和abd都较高的第二个条目。我是 有兴趣查看obs较低但abd为第三的条目 更高,因为在obs和abd之间需要权衡。再次,我是 对第四个条目不感兴趣,因为它的值为obs 和abd都高于第三个中已经显示的 条目。第五项是我特别感兴趣的一项,因为 尽管abd值稍高,但obs值低得多。 至于其他条目,我不想看到它们,因为 他们的obs和abd都比已经看到的要高。 总而言之,我想要一个查询,向我显示
+------+--------------+
| obs  | abd          |
+------+--------------+
| 1372 | 0.0000004744 |
| 1010 | 0.0000017716 |
|  383 | 0.0000066084 |
+------+--------------+
加上obs持续减少和abd的另外七个条目 继续增加。有没有办法获取一组数据对 一个查询而不诉诸程序?     

解决方法

要获得最低的
obs
abd
,请按照以下步骤操作:
select min(obs),abd
from flow
where obs < 2000 
group by abd 
order by abd
但是在我看来,权衡规则是临时的。您应该尝试找出可以想到的最佳规则,并将它们放在桌面上,以便我们可以实现您想要做的事情。     ,您可能只是想说一个帕累托战线 它不会很快,但是请尝试以下操作:
SELECT a.obs,a.abd
FROM flow a
  LEFT JOIN flow b
    ON   ( b.obs <= a.obs AND b.abd <  a.abd )
      OR ( b.obs <  a.obs AND b.abd <= a.abd )
WHERE b.obs IS NULL
ORDER BY a.abd
也:
SELECT a.obs,a.abd
FROM flow a
WHERE NOT EXISTS
  ( SELECT 1
    FROM flow b
    WHERE ( b.obs <= a.obs AND b.abd <  a.abd )
      OR ( b.obs <  a.obs AND b.abd <= a.abd )
  )
ORDER BY a.abd
和这个:
SELECT a.obs,a.abd
FROM flow a
WHERE NOT EXISTS
  ( SELECT 1
    FROM flow b
    WHERE b.obs <= a.obs
      AND b.abd <  a.abd
  )
  AND NOT EXISTS
  ( SELECT 1
    FROM flow b
    WHERE b.obs < a.obs
      AND b.abd = a.abd
  )
ORDER BY a.abd
或这个:
SELECT a.obs,a.abd
FROM flow a
WHERE NOT EXISTS
  ( SELECT 1
    FROM flow b
    WHERE b.obs <= a.obs
      AND b.abd <= a.abd
      AND (b.obs,b.abd) <> (a.obs,a.abd)
  )
ORDER BY a.abd
检查4个中哪个更快。如果您在
obs
abd
上有索引,我会猜第四个。或者更好的是(如Unreason所指出的),有两个索引:一个在
(obs,abd)
上,另一个在
abd
上。 更新: (对第3个查询的更正)。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...