Выберите записи, где комбинации столбцов повторяются с использованием SQLite - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть таблица со следующими столбцами:

a|b|c|d|e

, и я хочу выбрать все записи так, чтобы повторялась комбинация подмножества столбцов (скажем, a, b, c),Пример:

a|b|c|d|e
1|2|3|1|2
6|7|8|9|1
1|2|3|4|5
1|2|2|5|4

должно привести к:

1|2|3|1|2
1|2|3|4|5

1 Ответ

4 голосов
/ 24 февраля 2012

Это будет сделано:

SELECT a,b,c,d,e
  FROM t t1
 WHERE EXISTS ( SELECT NULL
                  FROM t t2
                 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c
                   AND t1.rowid <> t2.rowid
              )

Второй способ (SQLite не поддерживает (x,y) in (select two columns)):

SELECT a,b,c,d,e
  FROM t
 WHERE quote(a)||','||quote(b)||','||quote(c)
    IN ( SELECT quote(a)||','||quote(b)||','||quote(c)
           FROM t
          GROUP BY a,b,c
         HAVING COUNT(*) > 1
       )

Третий способ:

SELECT a,b,c,d,e
  FROM ( SELECT a,b,c
           FROM t
          GROUP BY a,b,c
         HAVING COUNT(*) > 1
       )
NATURAL JOIN t

Capture

Этот последний имеет преимущество, вы также можете добавить агрегированные строки (например, если вы использовали аналитические функции в других СУБД:)

sqlite> .headers on
sqlite> .mode column
sqlite> .width 3 3 3 3 3 20
sqlite> SELECT a,b,c,d,e,"Rows in this group"
   ...>   FROM ( SELECT a,b,c
   ...>               , COUNT(*) AS "Rows in this group"
   ...>            FROM t
   ...>           GROUP BY a,b,c
   ...>          HAVING COUNT(*) > 1
   ...>        )
   ...> NATURAL JOIN t;
a    b    c    d    e    Rows in this group
---  ---  ---  ---  ---  --------------------
1    2    3    1    2    2
1    2    3    4    5    2

, что аналогично этомув Oracle:

   WITH x AS
      (SELECT a,b,c,d,e,COUNT(*) OVER (PARTITION BY a,b,c) "Rows in this group"
         FROM t
      )
   SELECT * FROM x WHERE "Rows in this group" >= 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...