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

Откуда:
Сообщений: 1368
Есть таблица

ACCOUNT_CPRCODE 2012-10-30 00:55:00.587
ACCOUNT_CPRCODE 2012-10-29 00:55:00.490
ACCOUNT_CPRCODE 2012-10-28 00:55:01.183
ACCOUNT_CPRCODE 2012-10-27 00:55:00.857
ACTIVITY_STARTDATE 2012-10-30 00:55:00.587
ACTIVITY_STARTDATE 2012-10-29 00:55:00.490
ACTIVITY_STARTDATE 2012-10-28 00:55:01.183
ACTIVITY_STARTDATE 2012-10-27 00:55:00.857
ACTIVITY_STARTDATE 2012-10-26 15:53:10.010

есть вторая таблица, где есть просто дата, которая разграничивает 1ю таблицу на периоды, хотелось бы получить такой результат:
ACCOUNT_CPRCODE 2012-10-30 00:55:00.587
'' 2012-10-30 00:00:00
ACCOUNT_CPRCODE 2012-10-29 00:55:00.490
ACCOUNT_CPRCODE 2012-10-28 00:55:01.183
ACCOUNT_CPRCODE 2012-10-27 00:55:00.857
'' 2012-10-27 00:00:00
ACTIVITY_STARTDATE 2012-10-30 00:55:00.587
'' 2012-10-30 00:00:00
ACTIVITY_STARTDATE 2012-10-29 00:55:00.490
ACTIVITY_STARTDATE 2012-10-28 00:55:01.183
ACTIVITY_STARTDATE 2012-10-27 00:55:00.857
'' 2012-10-27 00:00:00
ACTIVITY_STARTDATE 2012-10-26 15:53:10.010

во второй таблице только значения:

2012-10-30 00:00:00
2012-10-27 00:00:00

что не пойму как их туда запихнуть?если через union , то как запихнуть после каждого значени 1 столбца?!
30 окт 12, 15:57    [13397745]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
если правильно понял, то используйте left join по связке в день (отрежте время)
30 окт 12, 16:13    [13397892]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
смотрю_тут,

UNION ALL + ORDER BY
30 окт 12, 16:18    [13397964]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
iap
смотрю_тут,

UNION ALL + ORDER BY


простой UNION ALL тут бесполезен, надо же каждый ACCOUNT разграничивать
30 окт 12, 16:20    [13397987]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
HandKot
iap
смотрю_тут,

UNION ALL + ORDER BY


простой UNION ALL тут бесполезен, надо же каждый ACCOUNT разграничивать

да , вот именно первый столбец по значению надо разграничивать, в занчения по времени второй таблицы.
30 окт 12, 16:29    [13398085]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
HandKot
iap
смотрю_тут,

UNION ALL + ORDER BY


простой UNION ALL тут бесполезен, надо же каждый ACCOUNT разграничивать
Я вот и не понял про "каждый".
Есть вообще какая-то закономерность в желаемом результате?

смотрю_тут, а можно воспроизвести описание задачи на человеческом языке?


HandKot, кстати говря, я имел в виду не просто UNION ALL, но и ORDER BY.
Например,
ORDER BY 1, 2 DESC
30 окт 12, 16:34    [13398130]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
зомби зомби зомби
Member

Откуда: из Жужеля!
Сообщений: 7437
CROSS JOIN + ORDER BY + CASE
30 окт 12, 16:42    [13398189]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
смотрю_тут
Member

Откуда:
Сообщений: 1368
значение 1 дата
значение 1 дата
' ' дата2 разделить из тбл2
значение 1 дата
значение 1 дата
' ' дата1 разделить из тбл2
значение 2 дата
значение 2 дата
' ' дата2 разделить из тбл2
значение 2 дата
значение 2 дата
' ' дата1 разделить из тбл2
значение 3 дата
значение 3 дата
' ' дата2 разделить из тбл2


примерно так
т.е группировать по значению с датой , затем в каждую группу вставить строку с датой из таблицы 2, и отсортировать по дате в каждо й группе
30 окт 12, 16:45    [13398212]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
tetxx
Member

Откуда:
Сообщений: 297
Не слишком изящно вышло, но, тем не менее, вот. Получите, распишитесь.
declare @events table(name varchar(20),dt datetime)
declare @period table(dt datetime)

insert into @events values
('ACCOUNT_CPRCODE','2012-10-30 00:55:00.587'),
('ACCOUNT_CPRCODE','2012-10-29 00:55:00.490'),
('ACCOUNT_CPRCODE','2012-10-28 00:55:01.183'),
('ACCOUNT_CPRCODE','2012-10-27 00:55:00.857'),
('ACTIVITY_STARTDATE','2012-10-30 00:55:00.587'),
('ACTIVITY_STARTDATE','2012-10-29 00:55:00.490'),
('ACTIVITY_STARTDATE','2012-10-28 00:55:01.183'),
('ACTIVITY_STARTDATE','2012-10-27 00:55:00.857'),
('ACTIVITY_STARTDATE','2012-10-26 15:53:10.010')

insert into @period values
('2012-10-30 00:00:00 '),
('2012-10-27 00:00:00')

;with p as (
  select p.dt as pStart, (select coalesce(min(dt),'9999-01-01') from @period p2 where p2.dt > p.dt) as pEnd 
  from @period p
  union all
  select '1900-01-01', min(dt)
  from @period
)
,result as (
  select ev.name, pStart, ev.dt
  from p
  inner join @events ev on ev.dt >= p.pStart and ev.dt < p.pEnd
  group by rollup (ev.name, pStart, ev.dt)
)
select case when dt is null then '' else name end as name
,  coalesce(dt,pStart) dt
from result r
where not(pStart is null and dt is null) 
  and not(dt   is   null and pStart = '1900-01-01') 
  and pStart is not null
order by r.name desc, r.pStart desc, r.dt desc


namedt
ACTIVITY_STARTDATE2012-10-30 00:55:00.587
2012-10-30 00:00:00.000
ACTIVITY_STARTDATE2012-10-29 00:55:00.490
ACTIVITY_STARTDATE2012-10-28 00:55:01.183
ACTIVITY_STARTDATE2012-10-27 00:55:00.857
2012-10-27 00:00:00.000
ACTIVITY_STARTDATE2012-10-26 15:53:10.010
ACCOUNT_CPRCODE2012-10-30 00:55:00.587
2012-10-30 00:00:00.000
ACCOUNT_CPRCODE2012-10-29 00:55:00.490
ACCOUNT_CPRCODE2012-10-28 00:55:01.183
ACCOUNT_CPRCODE2012-10-27 00:55:00.857
2012-10-27 00:00:00.000
30 окт 12, 16:52    [13398277]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Возможно, достаточно будет INNER JOINа двух таблиц по условию "Дата основной таблицы больше или равна дате таблицы периодов".
Для равных дат выводить пустую строку вместо имени.
30 окт 12, 16:52    [13398282]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
Возможно, достаточно будет INNER JOINа двух таблиц по условию "Дата основной таблицы больше или равна дате таблицы периодов".
Для равных дат выводить пустую строку вместо имени.
Нет, такой подход приведёт к задвоению, затроению и т.д.
Правда, это легко побороть
30 окт 12, 16:54    [13398301]     Ответить | Цитировать Сообщить модератору
 Re: Разграничить данные  [new]
смотрю_тут
Member

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

спасибо. попробую разобраться
30 окт 12, 17:00    [13398369]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить