Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Объединение выборок, ограниченных по числу строк. / 2 сообщений из 2, страница 1 из 1
09.03.2010, 20:42
    #36510037
Вопрос!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение выборок, ограниченных по числу строк.
Прошу прощения за кросс-постинг, не сразу догадался спросить здесь. :(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Мне нужно выбрать все строки из таблички A, начиная с заданной даты в заданном количество.
Количество и начальная дата хранятся в табличке B.

+
Скрипт
Код: 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.
RECREATE TABLE A (ID INTEGER NOT NULL,  RELEASE_DATE  DATE);
ALTER TABLE A ADD CONSTRAINT PK_A PRIMARY KEY (ID);


RECREATE TABLE B (ID INTEGER NOT NULL, FROM_DATE  DATE, QUANTITY   INTEGER);
ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY (ID);

INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 1 , '2009-01-01');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 2 , '2009-02-01');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 3 , '2010-01-01');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 4 , '2010-01-02');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 5 , '2010-02-01');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 6 , '2010-02-15');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 7 , '2010-02-20');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 8 , '2010-02-25');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 9 , '2010-03-01');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 10 , '2010-03-05');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 11 , '2010-04-06');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 12 , '2010-07-07');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 13 , '2010-08-08');
INSERT INTO A (ID, RELEASE_DATE)       VALUES ( 14 , '2010-09-09');


INSERT INTO B (ID, FROM_DATE, QUANTITY)       VALUES ( 1 , '2010-01-01',  2 );
INSERT INTO B (ID, FROM_DATE, QUANTITY)       VALUES ( 2 , '2010-02-13',  3 );
INSERT INTO B (ID, FROM_DATE, QUANTITY)       VALUES ( 3 , '2010-03-01',  11 );

COMMIT;

В итоге имеем:

Табличка A:
IDRELEASE_DATE101.01.2009201.02.2009301.01.2010402.01.2010501.02.2010615.02.2010720.02.2010825.02.2010901.03.20101005.03.20101106.04.20101207.07.20101308.08.20101409.09.2010

Табличка B:
IDFROM_RELEASEQUANTITY101.01.20102213.02.20103301.03.201011

Для каждой строки из B нужно получить множество строк из A, отсортированных по RELEASE_DATE, начиная со строки, значение RELEASE_DATE в которой не меньше чем значение A.FROM_DATE и в количество, не большем чем A.QUANTITY.


Т.е., для строки таблички В:

IDFROM_RELEASEQUANTITY101.01.20102

...должны быть выбраны след. строки таблички А:

IDRELEASE_DATE301.01.2010402.01.2010

Для строки

IDFROM_RELEASEQUANTITY213.02.20103

...должны быть выбраны след. строки таблички А:

IDRELEASE_DATE615.02.2010720.02.2010825.02.2010

А для строки

IDFROM_RELEASEQUANTITY301.03.201011

...должны быть выбраны след. строки таблички А:

IDRELEASE_DATE901.03.20101005.03.20101106.04.20101207.07.20101308.08.20101409.09.2010
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Итоговая выборка из А должна быть такой:

IDRELEASE_DATE301.01.2010402.01.2010615.02.2010720.02.2010825.02.2010901.03.20101005.03.20101106.04.20101207.07.20101308.08.20101409.09.2010
...т.е., сумма всех выборок.


C итоговой выборкой я бы хотел работать дальше - выбирать min/max и т.д....
Можно, конечно, написать отдельную ХП, но не хотелось бы: результат нужен в другой ХП...

...может быть, здесь CTE как - нибудь прикрутить?

Спасибо.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
СУБД: FireBird 2.5
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...
Рейтинг: 0 / 0
09.03.2010, 21:34
    #36510112
Вопрос!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединение выборок, ограниченных по числу строк.
Всем спасибо.

Решение от Таблоида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
  b.id b_id
  ,b.from_date
  ,b.quantity cnt_limit,
   a.id a_id
  ,a.release_date
  ,count(ax.id) cnt
from b
join a on b.from_date<=a.release_date
left join a ax
on ax.release_date>=b.from_date
   and (ax.release_date < a.release_date
        or ax.release_date = a.release_date and ax.id <= a.id
       )
group by b.id,b.from_date,b.quantity, a.id,a.release_date
having count(ax.id)<=b.quantity
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Объединение выборок, ограниченных по числу строк. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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