Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / как упорядочить периоды дат / 17 сообщений из 17, страница 1 из 1
13.05.2016, 16:24
    #39235339
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Добрый день всем.
Есть таблица в которой есть 3 поля: NUMB, DATA_S, DATA_E.
пример:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
NUMB	DATA_S		DATA_E
0	01.04.2016	30.04.2016
1	01.10.2015	30.04.2016
2	01.11.2015	30.04.2016
3	01.12.2015	30.04.2016
4	01.01.2016	30.04.2016
5	01.02.2016	30.04.2016
6	01.03.2016	30.04.2016
7	01.04.2016	30.04.2016


Подскажите как получить таблицу такого вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		
NUMB	DATA_S		DATA_E
0	01.04.2016	30.04.2016
1	01.10.2015	31.10.2015
2	01.11.2015	30.11.2015
3	01.12.2015	31.12.2015
4	01.01.2016	31.01.2016
5	01.02.2016	29.02.2016
6	01.03.2016	31.03.2016
7	01.04.2016	31.03.2016


NUMB может быть разное количество. Может попасться так что будет период несколько месяцев.
Может быть так что будет и разрыв между периодами.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Исходные данные
NUMB	DATA_S		DATA_E
0	01.04.2016	30.04.2016
1	01.10.2015	31.12.2015
2	01.11.2015	31.12.2015
3	01.12.2015	31.12.2015
4	01.03.2016	30.04.2016
5	01.04.2016	30.04.2016

Что нужно получить
NUMB	DATA_S		DATA_E
0	01.04.2016	30.04.2016
1	01.10.2015	31.10.2015
2	01.11.2015	30.11.2015
3	01.12.2015	31.12.2015
4	01.03.2016	31.03.2016
5	01.04.2016	31.03.2016

...
Рейтинг: 0 / 0
13.05.2016, 16:34
    #39235354
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Hello, Akrush!
You wrote on 13 мая 2016 г. 16:33:56:

Akrush> Подскажите как получить таблицу такого вида:принцип непонятен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2016, 16:39
    #39235363
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
akrushПодскажите как получить таблицу такого вида
Это ты спрашивай у того странного человека, который спроектировал такую странную структуру
данных. Кроме него вряд ли кто-то поймёт что это за фигня.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2016, 16:47
    #39235386
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Мимопроходящий,
Принцип такой:
1. Есть период
2. В этот период происходят какие-то действия во время которых создается новая строка с новым NUMB, но "автор" не менял период.
3. Мне нужно навести порядок. Увы что досталось - то досталось. Нужно правильно расставить периоды. Если в период "DATA_S"-"DATA_E" создается новая строка, то нужно в предыдущем поставить DATA_S минус 1 день (чтобы получить последний день прошлого месяца, т.к. "DATA_S" - всегда первый день месяца)

как-то так
...
Рейтинг: 0 / 0
13.05.2016, 16:48
    #39235388
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
akrushМимопроходящий,
Принцип такой:
1. Есть период
2. В этот период происходят какие-то действия во время которых создается новая строка с новым NUMB, но "автор" не менял период.
3. Мне нужно навести порядок. Увы что досталось - то досталось. Нужно правильно расставить периоды. Если в период "DATA_S"-"DATA_E" создается новая строка, то нужно в предыдущем поставить DATA_S минус 1 день (чтобы получить последний день прошлого месяца, т.к. "DATA_S" - всегда первый день месяца)

как-то так
Сори не пометил: в DATA_E записать DATA_S минус 1
...
Рейтинг: 0 / 0
13.05.2016, 16:49
    #39235394
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Можно ли это сделать средствами ФБ или "тупой" перебор строк в делфи
...
Рейтинг: 0 / 0
13.05.2016, 16:49
    #39235395
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
тут программист нужен.
я так думаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.05.2016, 16:49
    #39235396
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
akrush,

Так что-ли?
Код: sql
1.
DATE_E=DATEADD(DAY,-1,DATEADD(MONTH,1,DATE_S));
...
Рейтинг: 0 / 0
13.05.2016, 16:54
    #39235404
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
DarkMasterakrush,

Так что-ли?
Код: sql
1.
DATE_E=DATEADD(DAY,-1,DATEADD(MONTH,1,DATE_S));



Формула правильная, но как пройтись по таблице и применить ее к нужным строкам.
"ГОРЮ", после выходных ехать конвертировать базы, а там такая ерунда. Помогите, плиз.
...
Рейтинг: 0 / 0
13.05.2016, 17:06
    #39235424
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Приведенный фрагмент - это то на что нужно ориентироваться.
В каждой группе есть "номер дела" (APP)
В сочетание с NUM - получаю уникальный ключ.
В таблице есть индекс: APP, NUMB
вот описание таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Create table dela (
  APP integer,
  NUMB integer,
  Data_S Timestamp,
  Data_E Timestamp);

CREATE INDEX dela_appnumb ON dela (app,numb);

...
Рейтинг: 0 / 0
13.05.2016, 17:18
    #39235441
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Если брать "тупым" перебором, то получается:
1. select distinct app from dela - я получаю все номера дел.
2. select app, numb, data_s, data_e from dela where app=:app - я отбираю только одно дело со всеми периодами.
а дальше иду по строкам, беру numb=1, запоминаю data_s и data_e.
беру numb=2: если у него data_s < data_e но data_s > data_s (numb=1) тогда data_e (numb=1) = data_s - 1 day

но это получается жутко долго. В таблице около 700 000 строк, из них около 45 000 дел.

Можно ли как-то быстрее???
...
Рейтинг: 0 / 0
13.05.2016, 19:00
    #39235517
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
akrush,

А это так и должно быть, что DATA_E равно последнему дню предыдущего месяца?
Код: powershell
1.
5	01.04.2016	31.03.2016
...
Рейтинг: 0 / 0
13.05.2016, 19:22
    #39235526
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
akrushЕсли брать "тупым" перебором
Если приращение NUMB всегда равно 1, то получить записи для апдейта можно так:
Код: plsql
1.
2.
3.
4.
5.
select d1.APP, d1.NUMB, dateadd( day, -1, d2.DATA_S ) -- data_e(numb=1) = data_s(numb=2) - 1 day
  from DELA d1
  join DELA d2 on ( d2.APP = d1.APP and d2.NUMB = d1.NUMB + 1 )
 where d2.DATA_S < d2.DATA_E   -- data_s(numb=2) < data_e(numb=2)
   and d2.DATA_S > d1.DATA_S   -- data_s(numb=2) < data_s(numb=1)



Можно выполнить запрос в IBE и выкачать его в UPDATE SCRIPT
...
Рейтинг: 0 / 0
13.05.2016, 19:36
    #39235532
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Polesovakrush,

А это так и должно быть, что DATA_E равно последнему дню предыдущего месяца?
Код: powershell
1.
5	01.04.2016	31.03.2016



да, так должно быть. Если есть 2 обращения с одного и того же месяца, то предыдущее имеет, как бы, отрицательный период: data_s-data_e=-1
...
Рейтинг: 0 / 0
13.05.2016, 19:37
    #39235534
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
PolesovakrushЕсли брать "тупым" перебором
Если приращение NUMB всегда равно 1, то получить записи для апдейта можно так:
Код: plsql
1.
2.
3.
4.
5.
select d1.APP, d1.NUMB, dateadd( day, -1, d2.DATA_S ) -- data_e(numb=1) = data_s(numb=2) - 1 day
  from DELA d1
  join DELA d2 on ( d2.APP = d1.APP and d2.NUMB = d1.NUMB + 1 )
 where d2.DATA_S < d2.DATA_E   -- data_s(numb=2) < data_e(numb=2)
   and d2.DATA_S > d1.DATA_S   -- data_s(numb=2) < data_s(numb=1)



Можно выполнить запрос в IBE и выкачать его в UPDATE SCRIPT

Спасибо, сейчас попробую
...
Рейтинг: 0 / 0
13.05.2016, 19:48
    #39235540
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Polesov,
Огромное спасибо, наскорую проверил - вроде как ХОРОШО. Сейчас точнее проверю.
А как быть в случае если "Data_s" - "data_e" должно быть -1. Как то это можно отловить. Таких строк не много - но увы встречаются
...
Рейтинг: 0 / 0
13.05.2016, 21:59
    #39235580
stelvic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как упорядочить периоды дат
Скорее всего только перебором. Возможно с помощью хранимой процедуры или execute block, чтобы не тянуть на клиента. Можно использовать для перебора запрос, похожий на тот, что Полесов предложил. Но врядли точно в таком виде.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / как упорядочить периоды дат / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]