Faran Saleem Ответов: 3

Выберите количество строк с одинаковым идентификатором (SQL)


Привет,

Мой вопрос заключается в том, что у меня есть таблица со многими столбцами в ней, но ради этого вопроса у меня есть два важных столбца в ней,
1-ID_NO
2 - CurrentStepName


CurrentStepName имеет такие значения, как IV и эВ а в столбце ID_NO есть несколько идентификаторов, которые повторяются для IV и EV.
Например:
ID_NO----------CurrentStepName
1----------------IV
1----------------эВ
2----------------IV
3----------------ЭВ
4----------------IV
4----------------ЭВ

Если вы видите в приведенном выше примере идентификаторы 1 и 4 повторяются как для IV, так и для EV.
Теперь я хочу исключить один идентификатор из IV, где он дублируется с EV.
Результат, который я хочу, выглядит следующим образом.

ID_NO----------CurrentStepName
1----------------эВ
2----------------IV
3----------------ЭВ
4----------------ЭВ

В приведенном выше результирующем наборе 1 и 4 идентификатора IV удаляются, я хочу, чтобы это было так. И затем я хочу, чтобы рассчитать общее количество CurrentStepName.

Надеюсь, я ясно выразился.
Как всегда, с нетерпением жду вашей помощи.

Что я уже пробовал:

Перепробовал много вещей, но так и не смог получить результат

3 Ответов

Рейтинг:
24

Maciej Los

Чтобы иметь возможность обнаруживать "дубликаты", вы можете использовать НОМЕР СТРОКИ()[^] встроенная функция:

SELECT *, ROW_NUMBER() OVER(PARTITION BY ID_NO ORDER BY CurrentStepName) AS RowNo
FROM YourTable

Выше код возвращает:
ID_NO	CurrentStepName	RowNo
1		EV				1
1		IV				2
2		IV				1
3		EV				1
4		EV				1
4		IV				2


Все, что вам нужно сделать, это написать запрос на удаление строк с помощью RowNo=2.

Попробуй!


Рейтинг:
2

Graeme_Grant

Поиск в Google - ваш друг... Вот что получилось при быстром поиске: Предложение SQL WHERE[^]. Так:

SELECT .... WHERE ID='?'


Faran Saleem

Там много записей, которые я не могу использовать, где пункт и положить все идентификаторы там мой друг.
Я считаю, что здесь следует использовать подзапрос. Я пробовал использовать его, но безуспешно

Graeme_Grant

Опубликуйте то, что вы пробовали, и тогда мы сможем попытаться помочь вам оттуда. Мы здесь не для того, чтобы писать ваш код.

Faran Saleem

Вы можете спросить то же самое вежливо, и я выложу код, не нужно быть резким..

выберите count (ID_NO) в качестве TotalCount из таблицы 1
где currentstepname in ('EV', 'IV')
группа по ID_NO, имеющая count (ID_NO)> 1

Вышеизложенное дает мне дубликат числа ID_NO, но я также хочу отобразить значения CurrentStepName.

Graeme_Grant

Если Вы читаете рекомендации по размещению[^], то мой вопрос не потребовался бы.

Поиск в Google-ваш друг: SQL Server Group By Query выберите первую строку каждой группы[^Я настоятельно рекомендую научиться им пользоваться...

Faran Saleem

Я настоятельно рекомендую вам научиться хорошим манерам.. и это не то, что я ищу, если вы внимательно прочтете мой пост, то увидите.. В любом случае спасибо за вашу помощь..

Graeme_Grant

Если вам нужна помощь, не оскорбляйте тех, кто пытается вам помочь.

Graeme_Grant

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

[Edit] вот ссылка еще раз на тот случай, если вы пропустили ее в первый раз: SQL Server Group By Query выберите первую строку каждой группы[^]

Faran Saleem

И идентификаторы генерируются уникально, поэтому я даже не знаю, какие идентификаторы поместить в предложение where, если я пойду по вашему предложению,

Graeme_Grant

Судя по вашему примеру, идентификаторы не уникальны. Как выглядит ваше определение таблицы?

Рейтинг:
0

Garth J Lancaster

Можете ли вы поставить это (подзапрос)

select count(ID_NO) as TotalCount from table1
where currentstepname in ('EV','IV')
group by ID_NO having count(ID_NO)>1


во временную таблицу ? - не уверен в точном синтаксисе, потому что это зависит от того, какую БД вы используете, но что-то вроде

create temp table multi_IDNOs as select ID_NO, count(ID_NO) as TotalCount from table1
where currentstepname in ('EV','IV')
group by ID_NO having count(ID_NO)>1


тогда ваш запрос становится (Я думаю)

select ID_NO, currentstepname from table
where ID_NO in (select ID_NO from multi_IDNOs) and currentstepname = "EV"
union
select ID_NO, currentstepname from table
where ID_NO Not in (Select ID_No from multi_IDNOs)


Оригинальный способ, которым я думал об этом с подзапросом, скорее всего, плохо работает с точки зрения производительности, если вы можете сделать это без него, возможно, будет лучше

предостережение - мой SQL такой же ржавый, как и, поэтому, используйте его для руководства/идей