2016-10-20 3 views
-1

У меня есть таблица, которая содержит действия против определенных учетных записей, действия даются пронумерованным SET действий, и внутри этого SET они получают уникальный последовательный номер. Мы столкнулись с проблемой, когда какой-то один из уникальных номеров был дублирован и хотел бы проверить больше примеров, где это могло произойти. Таблица выглядит немного как это:Найти повторяющиеся значения в столбце, основанные на конкретных критериях

Account | Action Set | Action No | Action Code 
--------|------------|-----------|------------ 
    001 |  1  |  1  | GEN 
    001 |  1  |  2  | PHO 
    001 |  1  |  3  | RAN 
    001 |  1  |  3  | GEN 
    002 |  1  |  1  | GEN 
    002 |  1  |  2  | PHO 
    002 |  1  |  3  | RAN 

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

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

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

Account | Action Set | Action No | Action Code 
--------|------------|-----------|------------ 
    001 |  1  |  3  | RAN 
    001 |  1  |  3  | GEN 

Я бы после того, что я пытался до сих пор, но честно экстента код, который я написал до сих пор:

SELECT 

ТИА

Марк

+1

Вы должны отредактировать вопрос и привести примеры того, что вы * * хотите найти. Кажется, что ваши строки не соответствуют критериям. –

+1

Это очень хорошее начало! – jarlh

+0

@GordonLinoff - Я знаю, что вы уже ответили, и ваше решение сработало, но я обновил исходный вопрос с вашими предложениями, если он поможет кому-то еще с той же проблемой. Благодарю. –

ответ

0

На основании вашего описания, вы можете использовать exists:

select t.* 
from t 
where exists (select 1 
       from t t2 
       where t2.account = t.account and 
        t2.actionset = t.actionset and 
        t2.actionno <> t.actionno 
      ); 

EDIT:

выше предполагает, что число действий различны. В противном случае вы можете использовать:

select t.* 
from t 
where (select count(*) 
     from t t2 
     where t2.account = t.account and 
      t2.actionset = t.actionset 
    ) >= 2; 
+0

Спасибо за ваш ответ, номера действий ДОЛЖНЫ быть разными, но пытаются определить, где они одинаковы. Ваш второй запрос не работал для меня, просто возвращает все строки в базе данных. Тем не менее, я добавил дополнительный –

+0

извините, нажал ввести слишком рано, добавил дополнение к предложению WHERE, которое исправило его для меня, я отредактировал ваш ответ. –

0

попробовать это один

Select account,actionset,actioncode,actionno 
from table 
where (account,actionset) 
IN 
(
Select account,actionset from table 
group by account,actionset 
having count(distinct actionno)>1 
) 
group by account,actionset,actioncode,actionno 
+0

Спасибо за ваш ответ, но ему не нравится предложение where в скобках (account, actionset) - получение неправильной синтаксической ошибки около ',' –

+0

удалите скобки, а затем проверьте @MarkJeffries –

+0

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

0

Пожалуйста, найти свое решение для получения повторяющихся записей из таблицы.

SELECT [ActionSet],ActionCode,[ActionNo] 
FROM 
(
    SELECT *,ROW_NUMBER()OVER(PARTITION by [ActionSet],[ActionNo] ORDER BY 
    [ActionNo]) as rnk FROM [dbo].[ActionAccount] 
) t where t.rnk>1 

Спасибо.

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