1

したがってmy_table、主キーid( INT) と、さらに列foo( VARCHAR) およびbar( DOUBLE) を持つテーブルがあります。それぞれfooがテーブルに 1 回表示され、値が関連付けられているはずですが、同じs に異なる s が関連付けられbarた複数の行があることがわかっています。同じ値を含むが、 s が異なる (たとえば、10 以上異なる)行のリストを取得するにはどうすればよいですか? 私は試した:foobarfoobar

    SELECT t1.id、t1.bar、t2.id、t2.bar、t1.foo
    FROM my_table t1、my_table t2
    WHERE t1.foo=t2.foo
    AND t1.bar - t2.bar > 10.;

しかし、非常に多くの結果が得られます ( の行の合計数より多いmy_table)。私は明らかにばかげたことをしているに違いないと感じていますが、自分の間違いを見ることはできません。

ああ、ありがとう SWeko: では、これほど多くの結果が得られている理由が理解できたと思います。SQL で、それぞれfooの行数をカウントする方法はありますが、10 を超えて異なりますかfoo?bar

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 の結果が得られ、その数は の同じ値を持つ行の 2 乗で増加しますfoo

于 2013-02-22T15:44:04.243 に答える