Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 поиск дублей в столбце  [new]
sfsf
Member [скрыт]

Откуда:
Сообщений: 1022
MS SQL 2008 sp4

в таблице tt1 есть столбец ss5 в котором нужно найти дубли записей, кроме записей NULL

ss1 ss5
1 3456
2 3333
3 4666
4 6744
....

50 NULL
51 4578
52 3333
53 NULL

В данном примере дубли в строке 2 и 52 со значением 3333

Помогите с запросом. Спасибо.
8 май 15, 09:59    [17616478]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Glory
Member

Откуда:
Сообщений: 104751
sfsf
в котором нужно найти дубли записей,

И как должен выглядеть результат поиска?
8 май 15, 10:01    [17616494]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
хмхмхм
Guest
sfsf,

а вам для чего? лабораторную в институте сдать?
Поищите поиском, тут такие темы возникают раз в неделю.
8 май 15, 10:06    [17616516]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
xenix
Guest
 SELECT T.SS5, COUNT(T.SS5)CNT FROM TT1 AS T
  GROUP BY T.SS5
  HAVING COUNT(T.SS5)>1
   WHERE T.SS5 IS NOT NULL
8 май 15, 10:21    [17616602]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @temp TABLE (
	ss1 INT PRIMARY KEY,
	ss5 INT
)

INSERT INTO @temp (ss1, ss5)
VALUES 
	(1, 3456), (2, 3333),
	(3, 4666), (4, 6744),
	(50, NULL), (51, 4578),
	(52, 3333), (53, NULL)

SELECT *
FROM (
	SELECT *, cnt = COUNT(*) OVER (PARTITION BY ss5)
	FROM @temp
	WHERE ss5 IS NOT NULL
) t
WHERE t.cnt > 1


Погуглите оконные функции.
8 май 15, 10:22    [17616608]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
xenix
 SELECT T.SS5, COUNT(T.SS5)CNT FROM TT1 AS T
  GROUP BY T.SS5
  HAVING COUNT(T.SS5)>1
   WHERE T.SS5 IS NOT NULL
Ай, молодца! ©
8 май 15, 10:46    [17616782]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
xenix
Guest
автор
Ай, молодца!

Шо не так?
Я чего-то недопонял?
8 май 15, 11:02    [17616894]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
xenix
Guest
Впрочем, понял
SELECT T.SS5,COUNT(T.SS5)CNT
FROM @temp T
WHERE T.SS5 IS NOT NULL	
GROUP BY T.ss5
HAVING COUNT(T.SS5)>1

отдыхать в пятницу надо
8 май 15, 11:05    [17616907]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Glory
Member

Откуда:
Сообщений: 104751
xenix
Впрочем, понял

COUNT(*) returns the number of items in a group. This includes NULL values and duplicates.
COUNT(ALL expression) evaluates expression for each row in a group and returns the number of nonnull values.
8 май 15, 11:10    [17616935]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
sfsf
Member [скрыт]

Откуда:
Сообщений: 1022
SELECT T.SS5,COUNT(T.SS5)CNT
FROM @temp T
WHERE T.SS5 IS NOT NULL
GROUP BY T.ss5
HAVING COUNT(T.SS5)>1

этот запрос выводит
ss5 CNT
3333 2



Нужно чтобы выводил не количество строк, а сами одинаковые строки. Т.е. так

ss1 ss5
2 3333
52 3333
8 май 15, 12:39    [17617499]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Glory
Member

Откуда:
Сообщений: 104751
sfsf
Нужно чтобы выводил не количество строк, а сами одинаковые строки. Т.е. так

ss1 ss5
2 3333
52 3333

Вам поможет EXISTS()
8 май 15, 12:41    [17617513]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
sfsf,

Погуглите оконные функции. 


Вам же готовое решение я уже написал. В чем проблема?
8 май 15, 12:43    [17617526]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
В старые добрые времена, когда еще не было оконных функций, делали так:
with A as (
  select *
    from (values (1,  3456),
                 (2,  3333),
                 (3,  4666),
                 (4,  6744),
                 (50, NULL),
                 (51, 4578),
                 (52, 3333),
                 (53, NULL)
         ) as T (ss1,ss5)
)

select a.ss1, b.ss1, a.ss5
  from A a
  join A b on a.ss1<b.ss1 and a.ss5=b.ss5


Результат:
ss1	ss1	ss5
2 52 3333
8 май 15, 14:00    [17617987]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Glory
Member

Откуда:
Сообщений: 104751
Wlr-l
Результат:
ss1	ss1	ss5
2 52 3333

А нужно вот так

ss1 ss5
2 3333
52 3333
8 май 15, 14:03    [17618005]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
Glory,

Для этого случая Вы уже дали ответ.
8 май 15, 14:08    [17618039]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
Glory,

Для этого случая Вы уже дали ответ.
А Ваш ответ как отработает, если одинаковых значений будет не 2, а 3? А если 20?
8 май 15, 14:43    [17618260]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
iap,

будут выведены все уникальные пары. Например:
...
                 (52, 3333),
                 (62, 3333),
                 (72, 3333),
                 (53, NULL)
...


ss1	ss1	ss5
2 52 3333
2 62 3333
2 72 3333
52 62 3333
52 72 3333
62 72 3333
8 май 15, 15:33    [17618637]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
Wlr-l,

Если 20, то нужно что-то менять в консерватории...
8 май 15, 15:35    [17618643]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Wlr-l
Wlr-l,

Если 20, то нужно что-то менять в консерватории...
При программировании надо учитывать все возможные ситуации.
Иначе получается говнокод.
8 май 15, 18:34    [17619659]     Ответить | Цитировать Сообщить модератору
 Re: поиск дублей в столбце  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
iap,

в те времена, о которых я упомянул, написали бы так:

select a.ss1, b.ss1, a.ss5
  from A a, A b
 where a.ss1<b.ss1
   and a.ss5=b.ss5

т.е. говнокод в квадрате?

"При программировании надо учитывать все возможные ситуации.
Иначе получается говнокод."


Т.е. при проектировании велосипеда нужно учитывать и влияние Луны, иначе получится ГовноВелосипед?
12 май 15, 11:39    [17627820]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить