Форум программистов, компьютерный форум CyberForum.ru

Как использовать локальное представления? - PostgreSQL

Войти
Регистрация
Восстановить пароль
 
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
22.11.2016, 21:33     Как использовать локальное представления? #1
Получить информацию о яхтах, приносящих максимальный средний доход своим владельцам (воспользоваться «локальным» представлением).

решаю задачу таким образом, но не могу въехать как получить максимальный средний доход, и при этом пользоватся локальным представлениям(

SQL
1
2
3
4
5
CREATE VIEW "OwnerView" AS
SELECT o."FullName",COUNT (y."OwnerId"), AVG (c."Price") , MAX (c."Price")
FROM "Owner" AS o, "Yacht" AS y, "Contract" AS c
WHERE o."OwnerId" = y."OwnerId" AND y."YachtId" = c."YachtId"
GROUP BY  o."FullName"
Миниатюры
Как использовать локальное представления?  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2016, 21:33     Как использовать локальное представления?
Посмотрите здесь:

Использовать имя таблицы в качестве параметра триггерной функции PostgreSQL
PostgreSQL Как использовать битовую маску в Postgres
Как правильно использовать функцию RANK для подсчитываемых полей PostgreSQL

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
23.11.2016, 12:01  [ТС]     Как использовать локальное представления? #2
все, вроде бы решил)
SQL
1
2
3
4
5
CREATE VIEW "Max_Salary" AS
SELECT o."FullName",  ROW_NUMBER() OVER (ORDER BY AVG (c."Price") , MAX (c."Price")) 
FROM "Owner" AS o, "Yacht" AS y, "Contract" AS c
WHERE o."OwnerId" = y."OwnerId" AND y."YachtId" = c."YachtId"
GROUP BY  o."FullName"
grgdvo
501 / 442 / 120
Регистрация: 02.09.2012
Сообщений: 1,285
23.11.2016, 15:14     Как использовать локальное представления? #3
Не то чтобы меня это волнует, но мне кажется, что запрос не соответствует заданию.
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
23.11.2016, 15:16  [ТС]     Как использовать локальное представления? #4
grgdvo, а как его можно сделать по другому?
grgdvo
501 / 442 / 120
Регистрация: 02.09.2012
Сообщений: 1,285
23.11.2016, 16:07     Как использовать локальное представления? #5
если бы я сдавал, я бы сделал так

делаем представление о среднем доходе каждой яхты (не знаю, почему у вас его называют "локальным").
средний доход - это сумма всех контрактов яхты, разделенное на количество контрактов этой яхты.
SQL
1
2
3
4
CREATE VIEW "YachtDohod" AS
SELECT c."YachtId", SUM(c."Price") / COUNT(c."YachtId") AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId";
Далее подсчитываем максимальный средний доход и отбираем яхты только с максимальным доходом
SQL
1
2
3
4
5
6
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Вроде так

Добавлено через 2 минуты
ооо!!... ну и в представлении "YachtDohod" конечно можно SUM / COUNT заменить на AVG(c."Price").
это я слишком углубился в написание запроса
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
23.11.2016, 21:41  [ТС]     Как использовать локальное представления? #6
так это же два запроса, а нужно одним сделать)

Добавлено через 32 минуты
и еще оно чет не работает
grgdvo
501 / 442 / 120
Регистрация: 02.09.2012
Сообщений: 1,285
23.11.2016, 23:53     Как использовать локальное представления? #7
Цитата Сообщение от Trigger_name Посмотреть сообщение
и еще оно чет не работает
ошибку пишет?? или не те данные считает??

Цитата Сообщение от Trigger_name Посмотреть сообщение
так это же два запроса
вам не угодишь... а все же... что такое "локальное" представление??

SQL
1
2
3
4
5
6
7
8
9
10
WITH "YachtDohod" ("YachtId", "Dohod") AS
(SELECT c."YachtId", AVG(c."Price")  AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId")
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
25.11.2016, 21:55  [ТС]     Как использовать локальное представления? #8
grgdvo, локальное представления это когда во FROM используют SELECT.
У меня вопрос этот запрос возвращает только среднее арифметическое контрактов каждой яхты.
SQL
1
2
3
4
5
6
7
8
9
10
WITH "YachtDohod" ("YachtId", "Dohod") AS
(SELECT c."YachtId", AVG(c."Price")  AS "Dohod"
FROM "Contract" AS c
GROUP BY c."YachtId")
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
(SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
FROM "Yacht" AS y, "YachtDohod" AS yd
WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Как я понял здесь нужно сначала посчитать среднее арифметическое контракта каждой яхты, а потом вывести какой из контрактов каждой яхты есть самым большим.
Но как это сделать я не могу понять.
grgdvo
501 / 442 / 120
Регистрация: 02.09.2012
Сообщений: 1,285
26.11.2016, 00:31     Как использовать локальное представления? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Trigger_name Посмотреть сообщение
У меня вопрос этот запрос возвращает только среднее арифметическое контрактов каждой яхты.
Нет, возвращает максимальное среднее по каждой яхте

Цитата Сообщение от Trigger_name Посмотреть сообщение
Но как это сделать я не могу понять.
Подставьте вместо "YachtDohod" запрос из WITH

SQL
1
2
3
4
5
6
7
SELECT "OwnerId", "YachtId", "Name", "Dohod"
FROM
  (SELECT y."OwnerId", y."YachtId", y."Name", yd."Dohod", MAX(yd."Dohod") OVER (PARTITION BY "OwnerId") AS "MaxDohod"
  FROM "Yacht" AS y, 
           (SELECT c."YachtId", AVG(c."Price")  AS "Dohod" FROM "Contract" AS c GROUP BY c."YachtId") AS yd
  WHERE y."YachtId" = yd."YachtId") subquery
WHERE "Dohod" = "MaxDohod";
Trigger_name
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 22
01.12.2016, 22:46  [ТС]     Как использовать локальное представления? #10
grgdvo, спасибо)
Yandex
Объявления
01.12.2016, 22:46     Как использовать локальное представления?
Ответ Создать тему
Опции темы

Текущее время: 12:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru