2013-03-19 4 views
1

Вот мой пример таблица:SQL запрос - выбрать строки, по крайней мере, два повторяющихся значениями

|"id","singlesaleid","quantity" 
------------------------------------- 
| 1, "00278e0f", 37 
| 2, "00278e0f", 38 
| 3, "002ebd2e", 37 
| 4, "00380783", 37 
| 5, "003b3c35", 37 
| 6, "003b3c35", 38 
| 7, "0042170b", 38 
| 8, "00421b89", 37 
| 9, "00421b89", 38 
| 10, "00587f02", 37 
| 11, "00799433", 38 
| 12, "00799433", 37 

Как сделать выбор, чтобы выбрать и группа только эти строки, в singlesaleid столбца имеет значение по крайней мере, два дубликата?

Результат должен быть:

|"id","singlesaleid","quantity" 
------------------------------------- 
| 1, "00278e0f",  37 
| 6, "003b3c35",  38 
| 9, "00421b89",  38 
| 12, "00799433",  37 

Может кто-то помочь?

ответ

2
SELECT a.* 
FROM TableName a 
     INNER JOIN 
     (
      SELECT singlesaleid, MIN(quantity) min_val 
      FROM TableName 
      GROUP BY singlesaleid 
      HAVING COUNT(*) > 1 
     ) b a.singlesaleid = b.singlesaleid AND 
      a.quantity = b.Min_Val 
+0

Неправильный 'id' /' quantity' – MarcinJuraszek

+0

@MarcinJuraszek это потому, что ОП точно указала, как будет выбрано значение. Кстати, это дает правильное значение из строки выше. –

+0

@MarcinJuraszek см. Эти записи, как OP выбирал между записью '1 и 2' и' 11 и 12'? через самое низкое количество право? который отличается от записей '5 и 6' и' 8 и 9', потому что он выбирает наибольшее количество. –

0

Если вы хотите какой-либо из записей (только один) только тех singlesaleid's, который имеет по крайней мере 2 дубликатов попробуйте ниже код ..

select * from table where rowid in 
(select min(rowid) from table 
group by singlesaleid 
having count(*)>=2) 
+0

У меня есть ошибка: Неизвестный столбец 'rowid' в 'списке полей' – unky

+0

какой rdbms вы используете? Вышеуказанный запрос будет работать в 'Oracle' – Aspirant

0

Также вы можете использовать опцию с оператором EXISTS(). Хотя, я не совсем понимаю, что строка должна быть выбрана из группы, в запросе выбран ряд с MAX (t2.id)

SELECT * 
FROM Tablename t1 
WHERE EXISTS (
       SELECT * 
       FROM Tablename t2 
       WHERE t1.singlesaleid = t2.singlesaleid 
       HAVING COUNT(*) > 1 AND MAX(t2.Id) = t1.id 
      ) 

Демо на SQLFiddle

Смежные вопросы