powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Объединение выборок, ограниченных по числу строк.
2 сообщений из 2, страница 1 из 1
Объединение выборок, ограниченных по числу строк.
    #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
Объединение выборок, ограниченных по числу строк.
    #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]