1

所以我有一个表,my_table它有一个主键id( INT) 和更多列foo( VARCHAR) 和bar( DOUBLE)。每个都foo应该在我的表中出现一次,并带有一个关联的bar值,但我知道我有几行具有相同foo的 s 关联不同bar的 s。如何获取包含相同foo值但具有不同bars 的行的列表(例如,相差超过 10。)?我试过:

    选择 t1.id、t1.bar、t2.id、t2.bar、t1.foo
    FROM my_table t1,my_table t2
    哪里 t1.foo=t2.foo
    AND t1.bar - t2.bar > 10.;

但是我得到了很多结果(超过了 中的总行数my_table)。我觉得我一定在做一些非常明显愚蠢的事情,但看不到我的错误。

啊 - 谢谢 SWeko:我想我明白为什么我会得到这么多结果。SQL 中有没有一种方法可以计算每个s 相差超过 10foo的行数?foobar

4

3 回答 3

2

要回答您的最新问题:

SQL 中有没有一种方法可以计算每个 foo 的行数,但该 foo 的条数相差超过 10 个。

像这样的查询应该可以工作:

select t1.id, t1.foo, t1.bar, count(t2.id) as dupes
from my_table t1
  left outer join my_table t2 on t1.foo=t2.foo and (t1.bar - t2.bar) > 10
group by t1.id, t1.foo, t1.bar; 
于 2013-02-22T16:35:26.230 回答
1

例如,如果您有 5 行foo='A'和 10 行进行foo='B'自连接,则每个 A 行将彼此连接 A 行(包括其自身),每个 B 行彼此连接 B 行,所以一个简单的

SELECT t1.id, t1.bar, t2.id, t2.bar, t1.foo
FROM my_table t1, my_table t2
WHERE t1.foo=t2.foo

将返回5*5+10*10=125行。过滤值将减少该数字,但您可能仍然拥有(显着)比您开始时更多的行。例如,如果我们假设 B 行的值bar分别为 5 到 50,这意味着它们将匹配:

bar = 5  - 0 rows that have bar less than -5
bar = 10 - 0 rows that have bar less than 0
bar = 15 - 0 rows that have bar less than 5
bar = 20 - 1 rows that have bar less than 10
bar = 25 - 2 rows that have bar less than 15
bar = 30 - 3 rows that have bar less than 20
bar = 35 - 4 rows that have bar less than 25
bar = 40 - 5 rows that have bar less than 30
bar = 45 - 6 rows that have bar less than 35
bar = 50 - 7 rows that have bar less than 40

因此,仅 B 行就有 28 个结果,并且该数字随着具有相同值的行的平方而增加foo

于 2013-02-22T15:44:04.243 回答
-1

你用“新”JOIN语法尝试过同样的事情吗?

    SELECT t1.*,
           t2.*
      FROM my_table t1
      JOIN my_table t2 ON t1.foo = t2.foo
     WHERE (t1.bar - t2.bar) > 10

我不怀疑这会解决你的问题,但对我来说,这至少是我要开始的地方。

我也可以试试这个:

    SELECT t1.*,
           t2.*
      FROM my_table t1
      JOIN my_table t2 ON t1.foo = t2.foo AND t1.id != t2.id
     WHERE (t1.bar - t2.bar) > 10
于 2013-02-22T15:43:14.970 回答