Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL-запрос на получение периодов / 3 сообщений из 3, страница 1 из 1
20.04.2010, 09:05
    #36586787
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос на получение периодов
Помогите с запросом.
Есть таблица:
Код: plaintext
CREATE TABLE (ID1 INT NOT NULL, ID2 INT NOT NULL, PERIOD DATE NOT NULL, STATE SMALLINT NOT NULL, CONSTRAINT PRIMKEY PRIMARY KEY (ID1, ID2, PERIOD, STATE))
Если STATE 0, то PERIOD - дата окончания. Если STATE 1, то PERIOD - дата начала.
Нужно запросом получить таблицу с полями ID1, ID2, START_DATE, END_DATE, которая содержит все периоды из таблицы. Если нет начала или конца периода, то соответствующее поле - NULL.

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
20.04.2010, 12:20
    #36587279
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос на получение периодов
Вот если не NULL, а некие заведомо липовые даты для несуществующих начал или концов периодов назначить, то все просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select ID1
       , ID2
       , max(case STATE
               when  1  then PERIOD
               else '19000101'              
             end) as START_DATE 
       , min(case STATE
               when  0  then PERIOD
               else '20990101'
             end) as END_DATE 
  from  ...
 group by ID1, ID2
...
Рейтинг: 0 / 0
21.04.2010, 10:32
    #36589425
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL-запрос на получение периодов
golsa, спасибо, но запрос возвращает только по одному периоду на каждый ключ ID1-ID2. Надо чтобы вывелись все периоды.
Проблему решил таким запросом:
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
SELECT
	T.ID1,
	T.ID2,
	T.PERIOD AS BEGIN_DATE,
	MIN(Q.PERIOD) AS END_DATE
FROM S.MYTABLE T
LEFT JOIN (
	SELECT
		T1.ID1,
		T1.ID2,
		T1.PERIOD
	FROM S.MYTABLE T1
	WHERE T1.STATE =  0 
	) Q ON (T.ID1, T.ID2) = (Q.ID1, Q.ID2) AND T.PERIOD <= Q.PERIOD
WHERE T.STATE =  1 
GROUP BY T.ID1, T.ID2, T.PERIOD

UNION

SELECT
	T.ID1,
	T.ID2,
	MAX(Q.PERIOD) AS START_DATE,
	T.PERIOD AS END_DATE
FROM S.MYTABLE T
LEFT JOIN (
	SELECT
		T1.ID1,
		T1.ID2,
		T1.PERIOD
	FROM S.MYTABLE T1
	WHERE T1.STATE =  1 
	) Q ON (T.ID1, T.ID2) = (Q.ID1, Q.ID2) AND T.PERIOD >= Q.PERIOD
WHERE T.STATE =  0 
GROUP BY T.ID1, T.ID2, T.PERIOD
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL-запрос на получение периодов / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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