2016-12-23 9 views
1

У меня есть таблица выглядеть примерно так:SQL: Как выбрать отличие от некоторых столбцов

+---+------------+----------+ 
|ID | SomeNumber | SomeText | 
+---+------------+----------+ 
|1 | 100  | 'hey' | 
|2 | 100  | 'yo'  | 
|3 | 100  | 'yo'  | <- Second occurrence 
|4 | 200  | 'ey'  | 
|5 | 200  | 'hello' | 
|6 | 200  | 'hello' | <- Second occurrence 
|7 | 300  | 'hey' | <- Single 
+---+------------+----------+ 

Я хотел бы, чтобы извлечь строки, где SomeNumber появляется больше, чем те, и SomeNumbers и SomeText различны. Это означает, что я хотел бы:

+---+------------+----------+ 
|ID | SomeNumber | SomeText | 
+---+------------+----------+ 
|1 | 100  | 'hey' | 
|2 | 100  | 'yo'  | 
|4 | 200  | 'ey'  | 
|5 | 200  | 'hello' | 
+---+------------+----------+ 

Я не знаю, что делать здесь.

мне нужно что-то вдоль линий:

SELECT t.ID, DISTINCT(t.SomeNumber, t.SomeText) --this is not possible 
FROM (
    SELECT mt.ID, mt.SomeNumber, mt.SomeText 
    FROM MyTable mt 
    GROUP BY mt.SomeNumber, mt.SomeText --can't without mt.ID 
    HAVING COUNT(*) > 1 
) 

Любые предложения?

+0

Я удалил несовместимые теги базы данных. Пожалуйста, пометьте базу данных, которую вы действительно используете. –

+0

Почему в вашем результирующем наборе появляется '100 'hey'', это« сингл »? –

+0

Мне нужны все числа, если только они не появляются. Если текст появляется дважды на одном номере, остается только один. –

ответ

2

Использование КТР с номером строки и подсчета строк могли бы получить то, что вам нужно:

Создать и заполнить образец таблицы (Пожалуйста сохранить нас этот шаг в ваших будущих вопросов):

CREATE TABLE MyTable(id int, somenumber int, sometext varchar(10)); 
INSERT INTO MyTable VALUES 
(1,100,'hey'), 
(2,100,'yo'), 
(3,100,'yo'), 
(4,200,'ey'), 
(5,200,'hello'), 
(6,200,'hello'), 
(7,300,'hey'); 

запрос:

;WITH cte as 
(
    SELECT id, 
      someNumber, 
      someText, 
      ROW_NUMBER() OVER (PARTITION BY someNumber, someText ORDER BY ID) rn, 
      COUNT(id) OVER (PARTITION BY someNumber) rc 
    FROM MyTable 
) 
SELECT id, someNumber, someText 
FROM cte 
WHERE rn = 1 
AND rc > 1 

Результаты:

id someNumber someText 
1 100   hey 
2 100   yo 
4 200   ey 
5 200   hello 
+0

Мне действительно нужно изучить эту функцию '' PARTITION''. Он работает - я это понимаю :) Спасибо, @ zohar-peled –

+0

Привет, Зоар, у меня был аналогичный вопрос, и я не могу понять роль 'PARTITION BY' и' ROW_NUMBER() 'У меня 80 столбцов и я хочу, чтобы gt отличался от последних 72 столбцов, первые 8 столбцов не содержат PK или ID (это представление), и я не могу решить, какие столбцы выбрать в двух разделах, не могли бы вы мне помочь? –

+0

Row_number() просто создает число для каждой строки на основе предложения order by (и раздел by, если он указан). Если указан раздел by by, то каждый набор различных значений в предложении partition by получает свои собственные числа. Взгляните на этот [простой пример.] (Http://rextester.com/OEHZ99221) –