Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Составить простенький запрос / 18 сообщений из 18, страница 1 из 1
31.08.2007, 12:09
    #34767350
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
И снова здрасте.
сервер adaptive server sybase enterprise 12.

Есть необходимость составить запрос.
есть строки в таблице со следующими значениями - дата и признак. Дата всегда кратна кокомуто интервалу, часу.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
date                                  fl       obj
-------------------------------------------
 01 . 01 . 2000   0 : 0 : 0                   1           1 
 01 . 01 . 2000   0 : 1 : 0                   1           1 
 01 . 01 . 2000   0 : 2 : 0                   1           1 
 01 . 01 . 2000   0 : 3 : 0                   1           1  
 01 . 01 . 2000   0 : 4 : 0                   0           1 
 01 . 01 . 2000   0 : 0 : 0                   0           2 
 01 . 01 . 2000   0 : 1 : 0                   0           2 
 01 . 01 . 2000   0 : 2 : 0                   1           2 
 01 . 01 . 2000   0 : 3 : 0                   1           2  
 01 . 01 . 2000   0 : 4 : 0                   1           2 


необходимо выбрать дачало - конец интервала для объекта с флагом 1
результат должен быть такой

Код: plaintext
1.
2.
3.
4.
date beg                  date end                     obj
--------------------------------------------------
 01 . 01 . 2000   0 : 0 : 0     01 . 01 . 2000   0 : 3 : 0                 1 
 01 . 01 . 2000   0 : 2 : 0     01 . 01 . 2000   0 : 4 : 0                 2 

Можно ли такое получить без особого изврата?
...
Рейтинг: 0 / 0
31.08.2007, 12:14
    #34767375
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
И еще попутно вопрос, как можно пронумеровать строки, чтоб в дальнейшем их использовать
...
Рейтинг: 0 / 0
31.08.2007, 15:11
    #34768219
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
проверил только на ASA

Код: plaintext
1.
2.
3.
select distinct obj,
       date_beg=(select min(_date) from table1 t where t.obj=table1.obj and fl= 1 ),
       date_end=(select max(_date) from table1 t where t.obj=table1.obj and fl= 1 ),
from table1
...
Рейтинг: 0 / 0
31.08.2007, 15:34
    #34768358
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
УРА хоть кто-то ответил. А то я уже думал что тут никто запросы писать не умеет

Уточняю вопрос, так как предыдущицй пример немного не точный

Нужно отобразить все непрерывные интервалы с флагом, а рядом стоящие дат схлопнуть.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
date                                  fl       obj
-------------------------------------------
 01 . 01 . 2000   0 : 0 : 0                   1           1 
 01 . 01 . 2000   0 : 1 : 0                   1           1 
 01 . 01 . 2000   0 : 2 : 0                   1           1 
 01 . 01 . 2000   0 : 3 : 0                   1           1  
 01 . 01 . 2000   0 : 4 : 0                   0           1 
 01 . 01 . 2000   0 : 5 : 0                   0           1 
 01 . 01 . 2000   0 : 6 : 0                   0           1 
 01 . 01 . 2000   0 : 7 : 0                   1           1 
 01 . 01 . 2000   0 : 8 : 0                   1           1 
 01 . 01 . 2000   0 : 9 : 0                   0           1 
 01 . 01 . 2000   0 : 10 : 0                  1           1 
 01 . 01 . 2000   0 : 11 : 0                  1           1 
 01 . 01 . 2000   0 : 0 : 0                   0           2 
 01 . 01 . 2000   0 : 1 : 0                   0           2 
 01 . 01 . 2000   0 : 2 : 0                   1           2 
 01 . 01 . 2000   0 : 3 : 0                   1           2  
 01 . 01 . 2000   0 : 4 : 0                   0           2 
 01 . 01 . 2000   0 : 5 : 0                   1           2 
 01 . 01 . 2000   0 : 6 : 0                   1           2 
 01 . 01 . 2000   0 : 7 : 0                   0           2 
 01 . 01 . 2000   0 : 8 : 0                   1           2 

Результат должен быть
такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
date beg                  date end                     obj
--------------------------------------------------
 01 . 01 . 2000   0 : 0 : 0       01 . 01 . 2000   0 : 3 : 0                1 
 01 . 01 . 2000   0 : 7 : 0       01 . 01 . 2000   0 : 8 : 0                1 
 01 . 01 . 2000   0 : 10 : 0     01 . 01 . 2000   0 : 11 : 0              1 
 01 . 01 . 2000   0 : 2 : 0       01 . 01 . 2000   0 : 4 : 0                 2 
 01 . 01 . 2000   0 : 5 : 0       01 . 01 . 2000   0 : 6 : 0                 2 
 01 . 01 . 2000   0 : 8 : 0       01 . 01 . 2000   0 : 8 : 0                 2 


Если нет спецов, то ходябы подскажите, как выдать результат отсартированного запроса и поле в котором будет отображен номер строки.

Неужели это такая сложная задача, что никто не может подсказать. Или это настолько нетривиальная задача, что ее прпийдется делать через соответственное место? В предыдущем топике в мою сторону был намек, что профессионалам потом приходится мучаться с трудами таких как мы. На оракле все это решаеться очень простым сиквелом. Гуру сайбеса, неужели я хочу что-то сверх естественное, что никто не может подсказать?
...
Рейтинг: 0 / 0
31.08.2007, 16:04
    #34768515
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
авторНа оракле все это решаеться очень простым сиквелом.

приведите пример
...
Рейтинг: 0 / 0
31.08.2007, 16:12
    #34768556
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Без проблем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
obj,
min(period_start_time),
max(period_start_time)
 from 
  (
        select period_start_time,
              obj,
              trunc((period_start_time-trunc(sysdate))* 96 ) - row_number() over(partition by robj order by period_start_time) grp,
        from   tabl o 
        where fl= 1 
  )
 group by grp, obj
96 - это кол-во интервалов в сутках.
...
Рейтинг: 0 / 0
31.08.2007, 16:17
    #34768569
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
первичный ключ на таблицу имеется?
...
Рейтинг: 0 / 0
31.08.2007, 16:25
    #34768609
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
да, но он никак не упорядочен
...
Рейтинг: 0 / 0
02.09.2007, 05:55
    #34770085
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select 
date_beg = _date,
date_end = ISNULL((select top  1  _date
                   from table1 t2
                   where t2.obj = t1.obj and t2._date < (select top  1  _date
                                                         from table1 t3
                                                         where t3._date >= t1._date
                                                               and fl =  0 
                                                               and t3.obj = t1.obj
                                                         order by _date)
                   order by _date desc),
                   (select MAX(_date) from table1 t2 where t2.obj = t1.obj)
                  ),
obj
from table1 t1
where not exists(select *
                 from table1 t2
                 where t2.id = (select top  1  id
                                from table1 t3
                                where t3._date < t1._date
                                      and t3.obj = t1.obj
                                order by _date desc
                               )
                       and fl =  1 
                )
      and fl =  1 
order by obj, date_beg
...
Рейтинг: 0 / 0
03.09.2007, 12:38
    #34771339
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Спосибо за участие, но в adaptive server sybase enterprise 12. команды top нету
...
Рейтинг: 0 / 0
03.09.2007, 14:31
    #34771796
_makSim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Да, появилась в 12.5.3
...
Рейтинг: 0 / 0
03.09.2007, 14:46
    #34771869
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
обидно, но хотя бы подскажите, как для версии 12.0 пронумеровать строки
...
Рейтинг: 0 / 0
03.09.2007, 15:00
    #34771937
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
number(*) в ASA
но "Not supported by Adaptive Server Enterprise"
:)
...
Рейтинг: 0 / 0
03.09.2007, 15:22
    #34772018
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
за что же Sybase не любит Adaptive Server Enterprise??
...
Рейтинг: 0 / 0
03.09.2007, 17:47
    #34772608
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Новичек :-( пишет:
> обидно, но хотя бы подскажите, как для версии 12.0 пронумеровать строки

Я помню только один этот способ. что-то типа :

select identity(1), *
into #tmpres
from ...
....
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.09.2007, 21:52
    #34775974
Zhora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Существует такой стандартный метод: соединить таблицу саму с собой
по ключевым полям по >=, сгруппировать по ним и подсчитать сколько в
группе элементов - это и будет номер строки, для остальных полей - групповая функция - min/max.

Например (здесь нумерация в пределах id):
drop table td
/
create table td(id int, id_date datetime, type char(10))
/
create unique index index1 on td(id,id_date)
/
insert into td values (111, '20-Sep-2005', 'cancel')
/
insert into td values (111, '21-Sep-2005', 'debit')
/
insert into td values (112, '20-Jul-2005', 'credit')
/
insert into td values (112, '20-May-2005', 'debit')
/
insert into td values (112, '20-Sep-2005', 'cancel')
/
insert into td values (100, '20-Aug-2005', 'credit')
/
select * from td
order by id
/
select count(t2.id_date) rowno, t1.id, t1.id_date, max(t2.type)
from td t1, td t2
where t1.id_date >= t2.id_date
and t1.id = t2.id
group by t1.id , t1.id_date
...
Рейтинг: 0 / 0
05.09.2007, 08:33
    #34776248
москит
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Новичек :-(Спосибо за участие, но в adaptive server sybase enterprise 12. команды top нету

Код: plaintext
1.
2.
3.
4.
5.
(select top  1  _date
from table1 t3
where t3._date >= t1._date
and fl =  0 
and t3.obj = t1.obj
order by _date)
эквивалентно
Код: plaintext
1.
2.
3.
4.
5.
(select min(_date)
from table1 t3
where t3._date >= t1._date
and fl =  0 
and t3.obj = t1.obj
)
...
Рейтинг: 0 / 0
05.09.2007, 15:41
    #34778191
Новичек :-(
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составить простенький запрос
Вобщем я решил эту проблему следующим образом, привожу для примера, может кому-то пригодится. Всем спосибо за участие
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table #tmp(id numeric( 10 , 0 ) identity,StartTime DateTime,ObjectId numeric( 12 , 3 ), Det numeric( 10 , 0 ) )
insert into #tmp (StartTime,ObjectId,det)
select
StartTime,ObjectId
DATEDIFF(mi,convert(datetime,'05.08.2007', 104 ),StartTime)/ 30  det
-- делю на 30, так как прериоды 30 минут. 
from MyTable
where fl >  0 
and StartTime >=  convert(datetime,'31.08.2007', 104 )
order by ObjectId,StartTime
select ObjectId,min(StartTime), max(StartTime) from #tmp
group by ObjectId,det-id
order by ObjectId,min(StartTime)
drop table #tmp
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Составить простенький запрос / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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