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

Откуда:
Сообщений: 23
Есть последовательность данных

ipFROM;ipTO;countrySHORT;countryLONG;ipREGION;ipCITY
996084224;996084479;DE;GERMANY;BAYERN;BAMBERG
1055687680;1055687935;DE;GERMANY;SACHSEN;DRESDEN
1055948800;1055956991;DE;GERMANY;BAYERN;MUNICH
1055965184;1055965439;CH;SWITZERLAND;TICINO;LUGANO
1055965440;1055965695;CH;SWITZERLAND;-;-
1055965696;1055965951;CH;SWITZERLAND;ZURICH;ZURICH
1055965952;1055966207;CH;SWITZERLAND;-;-
1055966208;1055966463;CH;SWITZERLAND;ZURICH;ZURICH
1055966464;1055966975;CH;SWITZERLAND;-;-

Мне надо соединить все последовательности ip для стран

например сделать из верхнего так
ipFROM;ipTO;countrySHORT
996084224;996084479;DE
1055687680;1055687935;DE
1055948800;;1055966975;CH

Можно ли как-то запросом выбрать такую последовательность для каждой страны?

Выбрал бы руками но данных очень много

Заранее спасибо
6 ноя 09, 16:03    [7893147]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Supra93
Member

Откуда:
Сообщений: 8174
equil,
1055948800;1055956991;DE;GERMANY;BAYERN;MUNICH
а эта строка по какому признаку не учлась?
6 ноя 09, 16:10    [7893201]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
А почему результат содержит 1055948800 в той же строке что и CH ?
В исходных данных 1055948800 было в той же строке что и DE ...
6 ноя 09, 16:10    [7893205]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
почему:
1. 1055948800;1055956991;DE стало вдруг 1055948800;;1055966975;CH
2. для DE было три строки стало две, а для CH стала одна

З.Ы. это вы так таблицу показали или у вас там строка с разделителями?
--------------------------------------------------------------
Дьявол кроется в деталях.
6 ноя 09, 16:10    [7893206]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
equil,

1) куда подевалась строка номер три из верхнего примера ?
(1055948800;1055956991;DE;GERMANY;BAYERN;MUNICH)

2) ip 1055948800 относится вроде бы к ГЕМРАНИИ, а у Вас он оказался относящимся к Швейцарии
3) что обозначают два подряд символа ";" ?
6 ноя 09, 16:15    [7893235]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Автор по всей видости хочет объединть записи одной строны где ipTO "предыдущей" записи является продолджением ipFROM "следующей" записи
Потомиу DE два раза и получилась
6 ноя 09, 16:17    [7893255]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ещё бы версию сервера узнать.
6 ноя 09, 16:21    [7893291]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

Откуда:
Сообщений: 23
Glory
Автор по всей видости хочет объединть записи одной строны где ipTO "предыдущей" записи является продолджением ipFROM "следующей" записи
Потомиу DE два раза и получилась


Вы совершенно правы

Да тупанул с текстом чуток
из
ipFROM;ipTO;countrySHORT;countryLONG;ipREGION;ipCITY
996084224;996084479;DE;GERMANY;BAYERN;BAMBERG
1055687680;1055687935;DE;GERMANY;SACHSEN;DRESDEN
1055948800;1055956991;DE;GERMANY;BAYERN;MUNICH
1055965184;1055965439;CH;SWITZERLAND;TICINO;LUGANO
1055965440;1055965695;CH;SWITZERLAND;-;-
1055965696;1055965951;CH;SWITZERLAND;ZURICH;ZURICH
1055965952;1055966207;CH;SWITZERLAND;-;-
1055966208;1055966463;CH;SWITZERLAND;ZURICH;ZURICH
1055966464;1055966975;CH;SWITZERLAND;-;-

получится

ipFROM;ipTO;countrySHORT;countryLONG;ipREGION;ipCITY
996084224;996084479;DE
1055687680;1055687935;DE
1055948800;1055956991;DE
1055965184;1055966975;CH

Просто думал идея и так понятна ))

Версия сервера старая 2005.
В исходном варианте ето таблица.


Есть какие идеи по существу как ето сделать?

Заранее спасибо?
9 ноя 09, 10:09    [7899901]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Проще всего так:

declare @t table (ipfrom bigint primary key, ipto bigint, countryshort char(10))
insert @t select 996084224,996084479,'de'
union all select 1055687680,1055687935,'de'
union all select 1055948800,1055956991,'de'
union all select 1055965184,1055965439,'ch'
union all select 1055965440,1055965695,'ch'
union all select 1055965696,1055965951,'ch'
union all select 1055965952,1055966207,'ch'
union all select 1055966208,1055966463,'ch'
union all select 1055966464,1055966975,'ch'


;with q as (select ipfrom f, ipto t, countryshort c from @t
union all select f, ipto, countryshort from @t
inner join q on ipfrom=t+1 and countryshort=c)
select min(f),t,max(c)c
from (
select f, max(t)t, max(c)c
from q
group by f)t
group by t

Для боле-менее приличной скорости на больших данных необходим индекс по ipfrom
9 ноя 09, 10:22    [7899989]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

Откуда:
Сообщений: 23
Anddros
Проще всего так:

declare @t table (ipfrom bigint primary key, ipto bigint, countryshort char(10))
insert @t select 996084224,996084479,'de'
union all select 1055687680,1055687935,'de'
union all select 1055948800,1055956991,'de'
union all select 1055965184,1055965439,'ch'
union all select 1055965440,1055965695,'ch'
union all select 1055965696,1055965951,'ch'
union all select 1055965952,1055966207,'ch'
union all select 1055966208,1055966463,'ch'
union all select 1055966464,1055966975,'ch'


;with q as (select ipfrom f, ipto t, countryshort c from @t
union all select f, ipto, countryshort from @t
inner join q on ipfrom=t+1 and countryshort=c)
select min(f),t,max(c)c
from (
select f, max(t)t, max(c)c
from q
group by f)t
group by t

Для боле-менее приличной скорости на больших данных необходим индекс по ipfrom




Вопрос в том не испортятся ли данные в исходной таблице после етого может сделать какой-нибудь view?

и ключь у меня 2й ipfrom , ipto(хотя щас посмотрел)


кстати исходная таблица очень большая и там не 3 поля
ipFROM;ipTO;countrySHORT;countryLONG;ipREGION;ipCITY

А вот выборку надо получить уже с 3я полями
ipFROM;ipTO;countrySHORT
9 ноя 09, 11:05    [7900267]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
- Приведен просто запрос. Он ничего не меняем, поэтому не может ничего испортить.
- Ключ ipfrom , ipto годится
- Выборка и получается с 3 полями, независимо от того, сколько столбцов в таблице
9 ноя 09, 11:39    [7900452]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

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

Большое спасибо щас попробую
9 ноя 09, 12:26    [7900816]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

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

Пишет ошибку

Msg 530, Level 16, State 1, Line 2
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

Запрос

with q as (select ipfrom f, ipto t, countryshort c from [MediaStatistic].[dbo].[IPCITYISP]
union all select f, ipto, countryshort from [MediaStatistic].[dbo].[IPCITYISP]
inner join q on ipfrom=t+1 and countryshort=c)
select min(f),t,max(c)c
from (
select f, max(t)t, max(c)c
from q
group by f)t
group by t
9 ноя 09, 14:15    [7901815]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
option (maxrecursion 0)
в конец добавьте
9 ноя 09, 14:28    [7901940]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
А вообще при таких объемах наверняка решение через курсор будет быстрее.
9 ноя 09, 14:31    [7901969]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Anddros
option (maxrecursion 0)
в конец добавьте

т.к. это у автора ip для стран то возможно существует вероятность превышения ограничения в 32767,
хотя тут автору виднее.
9 ноя 09, 14:35    [7902010]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Дедушка
т.к. это у автора ip для стран то возможно существует вероятность превышения ограничения в 32767

Вы не поверите, но для maxrecursion(0) никакие 32767 не помеха. :)

;with q as (select 1 n union all select n+1 from q where n<40000)
select * from q option (maxrecursion 0)
9 ноя 09, 14:49    [7902158]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Anddros
Дедушка
т.к. это у автора ip для стран то возможно существует вероятность превышения ограничения в 32767

Вы не поверите, но для maxrecursion(0) никакие 32767 не помеха. :)

;with q as (select 1 n union all select n+1 from q where n<40000)
select * from q option (maxrecursion 0)

да можно было и без примера :)
это ж очевидно... что то я не о том думал.
9 ноя 09, 14:52    [7902196]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

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

Спасибо
Добавил Жду уже 2й час
А побыстрее ничего нету ?

((
9 ноя 09, 16:26    [7903185]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Glory
Member

Откуда:
Сообщений: 104760
equil
Anddros,

Спасибо
Добавил Жду уже 2й час
А побыстрее ничего нету ?

((

А какой объем данных вы пытаетесь обработать ?
И сделали ли нужные индексы ?
9 ноя 09, 16:28    [7903206]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

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

262145 строк

индекс у меня 2й ipfrom , ipto

прервал после час 40 база живая и грузить её так как то не хочется

Ждёмс ((
9 ноя 09, 16:56    [7903453]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Какова примерная средняя длина последовательностей типа
union all select 1055965184,1055965439,'ch'
union all select 1055965440,1055965695,'ch'
union all select 1055965696,1055965951,'ch'
union all select 1055965952,1055966207,'ch'
union all select 1055966208,1055966463,'ch'
union all select 1055966464,1055966975,'ch'
?
9 ноя 09, 17:13    [7903577]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

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

то что я видел строк 20 но может и больше я все строки не проверял
9 ноя 09, 17:15    [7903590]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
equil
Member

Откуда:
Сообщений: 23
;with q as (select ipfrom f, ipto t, countryshort c from [MediaStatistic].[dbo].[IPCITYISP]
where countryshort in ('DE','CH','AT') 
union all select f, ipto, countryshort from [MediaStatistic].[dbo].[IPCITYISP]
inner join q on ipfrom=t+1 and countryshort=c)
select min(f),t,max(c)c
from (
select f, max(t)t, max(c)c
from q
group by f)t
group by t
option (maxrecursion 0)

добавил только для 3х стран
where countryshort in ('DE','CH','AT')

может быстрее будет
жду
9 ноя 09, 17:18    [7903617]     Ответить | Цитировать Сообщить модератору
 Re: Как соединить последовательность данных SQL?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
имею ввиду количество записей. Понятно, что встречаются и >100, иначе не было бы выпадения по ошибке
Msg 530, Level 16, State 1, Line 2
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
. А вот какова средняя? И кстати, какова максимальная? Мне пришло в голову, что если у вас там статистика по какому-нить нашему сайту, то для RU там может быть львиная доля... Тогда неудивительно, что запрос умирает.
9 ноя 09, 17:19    [7903626]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить