powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL-запрос на получение периодов
3 сообщений из 3, страница 1 из 1
SQL-запрос на получение периодов
    #36586787
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите с запросом.
Есть таблица:
Код: 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
SQL-запрос на получение периодов
    #36587279
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот если не 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
SQL-запрос на получение периодов
    #36589425
BuryCommoner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
3 сообщений из 3, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL-запрос на получение периодов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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