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

Откуда: Russia/Moscow
Сообщений: 206
Таблица пример:

ID PARAM1 PARAM2
1 127.0.0.1 2eaee7ef16be437f
2 127.0.0.1 2eaee7efed42b07f
3 127.0.0.1 2eaee7ef9f69607f
4 127.0.0.2 a1c792522a66e013
5 127.0.0.2 a1c792522a66e013
6 127.0.0.2 a1c792522a66e013
7 127.0.0.156 7fffd8c26268a119
8 127.0.0.157 47c6c8d1fc97aa6d
9 127.0.0.158 01f0c2400a16201d
10 127.0.0.3 16a4e55d16be437f
11 127.0.0.3 16a4e55ded42b07f
12 127.0.0.3 16a4e55d9f69607f

Нужно чтоб выбрало из примера ID 1,2,3,10,11,12
условия
- чтоб между этой группой был одинаковый PARAM1
- параметр PARAM2 был разный между собой, но одинаковый по первым 8 символам
22 янв 14, 18:16    [15453569]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову над запросом  [new]
Диклевич Александр
Member

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

можно так
WITH BaseSelect AS (SELECT a.[id], a.[param1], a.[param2] FROM (
VALUES
(1	 ,'127.0.0.1'	,'2eaee7ef16be437f')
,(2	 ,'127.0.0.1'	,'2eaee7efed42b07f')
,(3	 ,'127.0.0.1'	,'2eaee7ef9f69607f')
,(4	 ,'127.0.0.2'	,'a1c792522a66e013')
,(5	 ,'127.0.0.2'	,'a1c792522a66e013')
,(6	 ,'127.0.0.2'	,'a1c792522a66e013')
,(7	 ,'127.0.0.156'	,'7fffd8c26268a119')
,(8	 ,'127.0.0.157'	,'47c6c8d1fc97aa6d')
,(9	 ,'127.0.0.158'	,'01f0c2400a16201d')
,(10     ,'127.0.0.3'	,'16a4e55d16be437f')
,(11     ,'127.0.0.3'	,'16a4e55ded42b07f')
,(12     ,'127.0.0.3'	,'16a4e55d9f69607f')
) a([id], [param1], [param2]))
SELECT DISTINCT b.*
FROM BaseSelect b
JOIN BaseSelect c ON b.[param1] = c.[param1] AND LEFT(b.[param2], 8) = LEFT(c.[param2], 8) AND RIGHT(b.[param2], 8) <> RIGHT(c.[param2], 8)


если таблица небольшая, то норм.
а если большая, то можно разбить PARAM2 на 2 по 8 символов, тогда можно проиндексировать и избавиться от LEFT и RIGHT.
22 янв 14, 18:40    [15453644]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову над запросом  [new]
SERG1257
Member

Откуда:
Сообщений: 2748
Четче определитесь с условиями задачи
вы группируете по PARAM1 или по PARAM1 плюс LEFT(param2, 8)?
в полученной группе должно быть более одной записи?
в полученной группе не должно быть повторяющихся значений param2?
В итоговую выборку включаются все id из группы или ни одного если группа не удовлетворяет условиям?
22 янв 14, 19:31    [15453831]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову над запросом  [new]
Диклевич Александр
Member

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

вариант 2:
WITH BaseSelect AS (SELECT a.[id], a.[param1], a.[param2] FROM (
VALUES
(1	 ,'127.0.0.1'	,'2eaee7ef16be437f')
,(2	 ,'127.0.0.1'	,'2eaee7efed42b07f')
,(3	 ,'127.0.0.1'	,'2eaee7ef9f69607f')
,(4	 ,'127.0.0.2'	,'a1c792522a66e013')
,(5	 ,'127.0.0.2'	,'a1c792522a66e013')
,(6	 ,'127.0.0.2'	,'a1c792522a66e013')
,(7	 ,'127.0.0.156'	,'7fffd8c26268a119')
,(8	 ,'127.0.0.157'	,'47c6c8d1fc97aa6d')
,(9	 ,'127.0.0.158'	,'01f0c2400a16201d')
,(10     ,'127.0.0.3'	,'16a4e55d16be437f')
,(11     ,'127.0.0.3'	,'16a4e55ded42b07f')
,(12     ,'127.0.0.3'	,'16a4e55d9f69607f')
) a([id], [param1], [param2]))
SELECT b.*
FROM BaseSelect b
WHERE EXISTS(SELECT c.* FROM BaseSelect c WHERE b.[param1] = c.[param1] AND LEFT(b.[param2], 8) = LEFT(c.[param2], 8) AND RIGHT(b.[param2], 8) <> RIGHT(c.[param2], 8))
22 янв 14, 19:32    [15453835]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову над запросом  [new]
jemoje
Member

Откуда: Russia/Moscow
Сообщений: 206
Диклевич Александр,

спасибо, тоже работает, более верно чем я сделал. всё таки)
24 янв 14, 02:17    [15460269]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову над запросом  [new]
over()?
Guest
jemoje,
WITH BaseSelect AS (SELECT a.[id], a.[param1], a.[param2] FROM (
VALUES
(1	 ,'127.0.0.1'	,'2eaee7ef16be437f')
,(2	 ,'127.0.0.1'	,'2eaee7efed42b07f')
,(3	 ,'127.0.0.1'	,'2eaee7ef9f69607f')
,(4	 ,'127.0.0.2'	,'a1c792522a66e013')
,(5	 ,'127.0.0.2'	,'a1c792522a66e013')
,(6	 ,'127.0.0.2'	,'a1c792522a66e013')
,(7	 ,'127.0.0.156'	,'7fffd8c26268a119')
,(8	 ,'127.0.0.157'	,'47c6c8d1fc97aa6d')
,(9	 ,'127.0.0.158'	,'01f0c2400a16201d')
,(10     ,'127.0.0.3'	,'16a4e55d16be437f')
,(11     ,'127.0.0.3'	,'16a4e55ded42b07f')
,(12     ,'127.0.0.3'	,'16a4e55d9f69607f')
) a([id], [param1], [param2]))

, res as (select *, 
	--left(param2, 8), RIGHT(param2, 8),
	count(*) over(partition by param1, left(param2, 8)) as r 
	, COUNT(*) over(partition by param1, param2) as c
from BaseSelect )


select * 
from res r
where r.r > 1 and r.c <> r.r
--order by id
24 янв 14, 12:29    [15462036]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить