powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
15 сообщений из 15, страница 1 из 1
Помогите составить запрос
    #32988812
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть 2 таблицы
a: поля id, data(date) и cost
b: поля id, data(date) и cost.

Надо выбрать 10 последних дат, записи которых есть в таблицах или а или b(то есть, есть а но может как быть так и не быть в b и наоборот) и сумму за эту дату - сумма cost из a и b(если есть в b) в зависимости от id.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32988894
Kartas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orion2есть 2 таблицы
a: поля id, data(date) и cost
b: поля id, data(date) и cost.

Надо выбрать 10 последних дат, записи которых есть в таблицах или а или b(то есть, есть а но может как быть так и не быть в b и наоборот) и сумму за эту дату - сумма cost из a и b(если есть в b) в зависимости от id.

хм. а приоритетно откуда надо выбрать? или пофигу?
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989037
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Kartas
пофигу главное 10 последних.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989158
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно так:
orion2есть 2 таблицы
a: поля id, data(date) и cost
b: поля id, data(date) и cost.

Надо выбрать 10 последних дат,

=> подзапрос дат
(SELECT date
....
GROUP BY DATE .... (или DISTINCT)
... ORDER BY data DESC .... LIMIT 10) AS d
orion2
записи которых есть в таблицах или а или b(то есть, есть а но может как быть так и не быть в b и наоборот)

FULL JOIN USING(data)
(я правильно понял, что надо проверять по датам)?
orion2
и сумму за эту дату - сумма cost из a и b(если есть в b)

SUM(a.cost) + SUM(b.cost)
orion2
в зависимости от id.
GROUP BY DATE, id
уже на весь запрос -
что-то наподобь:

SELECT ...
FROM (t1 FULL JOIN t2 USING(date,id)) INNER JOIN (...см више ...) AS d USING(date)
GROUP BY DATE, id
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989224
KRED
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orion22 Kartas
пофигу главное 10 последних.

create view V1 "select * from a union select * from b"


select
*
from
V1 a1
where
a1.id in (select id from V1 a2 where a1.id=a2.id order by datum desc limit 10)


PS privedi explain plz
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989268
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KREDcreate view V1 "select * from a union select * from b"


пишет
ERROR: UNION types date and integer cannot be matched

2 4321
Я понимаю идею но не могу до конца допереть.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989291
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orion2 KREDcreate view V1 "select * from a union select * from b"


пишет
ERROR: UNION types date and integer cannot be matched


Да. Там в таблицах a и b есть другие поля, наверное поэтому выдает такую ошибку.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32989376
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то наподобь:

SELECT
id,
date,
SUM(a.cost) + SUM(b.cost) AS summa
FROM (t1 FULL OUTER JOIN t2 USING(date,id)) INNER JOIN (
SELECT DISTINCT date
FROM t1 FULL OUTER JOIN t2 USING(date)
ORDER BY data DESC LIMIT 10
) AS d USING(date)
GROUP BY DATE, id

или типа этого:

SELECT
id, date , SUM(cost) FROM
(SELECT id, date , cost FROM t1
UNION ALL
SELECT id, date , cost FROM t2) AS u
WHERE u.date IN(SELECT date FROM (
SELECT date FROM t1
UNION
SELECT date FROM t2
ORDER BY date DESC) AS u2 LIMIT 10)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #32994644
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 4321

Огромное спасибо!
Окончательно селект выглядит так

SELECT id, date , SUM(cost) FROM(SELECT id, date , cost FROM a
UNION ALL
SELECT id, date , cost FROM b) AS u WHERE id=4 and u.date
IN
(SELECT date FROM (SELECT date FROM a where id=4 and date>date_trunc('day',now()-interval '11 day')
UNION
SELECT date FROM b WHERE id=4 and date>date_trunc('day',now()-interval '11 day')) as u2)
GROUP BY u.id, u.date ORDER BY date DESC

И что самое замечательное в таблицы > 10 млн. записей(с индексами разумеется) работает около 10 мсек.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33009869
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуста, помогите. Уже 2-й день сижу ломаю голову над запросом, и так его и так... Работа остановилась...
Есть 2 таблицы:
1. ls: поля id, idserv - хрянятся допустимые idserv для конкретного id
2. dc: поля: id, idserv, cost - хранятся цены для idserv, в зависимости от id. Также хранятся цены для idserv по умолчанию - там id=0.
У одного id может быть несколько idserv, idserv может иметь свою цену для id(тогда запись id, idserv, cost есть) и цену по умолчанию(id=0) - тогда записи нет.

Необходимо выбрать все idserv с ценами для конкретного id.


Плиз, действительно очень нужно.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33010725
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orion2Пожалуста, помогите. Уже 2-й день сижу ломаю голову над запросом, и так его и так... Работа остановилась...
Есть 2 таблицы:
1. ls: поля id, idserv - хрянятся допустимые idserv для конкретного id
2. dc: поля: id, idserv, cost - хранятся цены для idserv, в зависимости от id. Также хранятся цены для idserv по умолчанию - там id=0.
У одного id может быть несколько idserv, idserv может иметь свою цену для id(тогда запись id, idserv, cost есть) и цену по умолчанию(id=0) - тогда записи нет.
Необходимо выбрать все idserv с ценами для конкретного id.
Плиз, действительно очень нужно.

Как-то сильно сумбурно поставлена задача. Я не совсем понял зачем нужна первая таблица, если всё что надо храниться во второй.

Код: 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.
CREATE TABLE dc(
  id bigint,
  idserv bigint,
  cost double precision
);

--------
INSERT INTO "public"."dc" ("id", "idserv", "cost")
VALUES 
  ('1','1','10');

INSERT INTO "public"."dc" ("id", "idserv", "cost")
VALUES 
  ('1','2','100');

INSERT INTO "public"."dc" ("id", "idserv", "cost")
VALUES 
  ('0','2','1000');

INSERT INTO "public"."dc" ("id", "idserv", "cost")
VALUES 
  ('0','3','1000');

------------
SELECT
  (CASE WHEN t1.id IS NOT NULL THEN t1.id ELSE t2.id END) as id,
  (CASE WHEN t1.idserv IS NOT NULL THEN t1.idserv ELSE t2.idserv END) as idserv,
  (CASE WHEN t1.cost IS NOT NULL THEN t1.cost ELSE t2.cost END) as cost
FROM
  (SELECT * FROM dc WHERE id= 1 )as t1
  FULL JOIN (SELECT * FROM dc WHERE id= 0 )as t2
  ON(t1.idserv=t2.idserv)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33010806
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mwolf

Как-то сильно сумбурно поставлена задача. Я не совсем понял зачем нужна первая таблица, если всё что надо храниться во второй.


Огромное спасибо, но...
Приведенный селект выбирает все записи для id, даже те для которых нет idserv. Например id=39 выдает
id | idserv | cost
----+------+------
0 | 24 | 3
0 | 25 | 1
0 | 77 | 5
0 | 102 | 10
39| 105 | 10
....
А дело в том что idserv 24 для id=39 нет, - для этого и нужна первая таблица, что в ней перечислены допустимые idserv для id.
Допустим для id = 39, доступен(согласно 1 табл) idserv = 23. А записи(39,23,ххх) во 2-й табл нет, тогда мы должны выбрать запись (0,23,ххх)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33010971
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
  (CASE WHEN t1.id IS NOT NULL THEN t1.id ELSE t2.id END) as id,
  (CASE WHEN t1.idserv IS NOT NULL THEN t1.idserv ELSE t2.idserv END) as idserv,
  (CASE WHEN t1.cost IS NOT NULL THEN t1.cost ELSE t2.cost END) as cost
FROM
  (SELECT * FROM dc WHERE id=_1_)as t1
  FULL JOIN (SELECT dc.* FROM dc, ls WHERE dc.id= 0  AND ls.id=_1_ AND ls.idserv=dc.idserv)as t2
  ON(t1.idserv=t2.idserv)
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33011272
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mwolf Огромное спасибо! Работает!

Вот правда решил немного усложнить запрос, чтоб выводилось еще название idserv - хранится в таблице idserv_descr: поля idserv, name.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  (CASE WHEN t1.idserv IS NOT NULL THEN t1.idserv ELSE t2.idserv END) as idserv,
  (CASE WHEN t1.cost IS NOT NULL THEN t1.cost ELSE t2.cost END) as cost,
  sid.name
FROM
  (SELECT * FROM dc WHERE id= 39 ) as t1
  FULL JOIN (SELECT dc.* FROM dc, ls WHERE dc.id= 0  AND ls.lid= 39  AND ls.idserv=dc.idserv) as t2
  ON(t1.idserv=t2.idserv), idserv_descr as sid
WHERE
 ...idserv=sid.idserv
А вот проблема объединять по чем? Ни t1.idserv=sid.idserv, ни t2.idserv=sid.idserv нельзя делать.
...
Рейтинг: 0 / 0
Помогите составить запрос
    #33011288
orion2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orion2 mwolf Огромное спасибо! Работает!

Вот правда решил немного усложнить запрос, чтоб выводилось еще название idserv - хранится в таблице idserv_descr: поля idserv, name.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  (CASE WHEN t1.idserv IS NOT NULL THEN t1.idserv ELSE t2.idserv END) as idserv,
  (CASE WHEN t1.cost IS NOT NULL THEN t1.cost ELSE t2.cost END) as cost,
  sid.name
FROM
  (SELECT * FROM dc WHERE id= 39 ) as t1
  FULL JOIN (SELECT dc.* FROM dc, ls WHERE dc.id= 0  AND ls.lid= 39  AND ls.idserv=dc.idserv) as t2
  ON(t1.idserv=t2.idserv), idserv_descr as sid
WHERE
 ...idserv=sid.idserv
А вот проблема объединять по чем? Ни t1.idserv=sid.idserv, ни t2.idserv=sid.idserv нельзя делать.

упс, все догнал. работает если написать
...
WHERE
t1.idserv=sid.idserv or t2.idserv=sid.idserv

Еще раз mwolf огромное СПАСИБО!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите составить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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