Функция, которая возвращает ближайшую рейтинговую команду города в Postgres
74
8
Скажем, у меня есть столовая лига (город, команда) и рейтинги (город, рейтинг) (все строки, за исключением рейтинга, который является реальным типом). В рейтинге есть дополнительные города, которые не обязательно входят в лигу. Я пытаюсь создать функцию под названием closestRating, которая будет принимать в городе и вернуть имя команды, чей город имеет наименьший разрыв в рейтингах (а не сам) с городом в параметре функции или имени команды, соответствующей город, если город, который мы ищем, существует в лиге. (Город определяется как varchar (20) как в лиге, так и в рейтингах).
Моя попытка иметь некоторые действительно странные синтаксические ошибки
CREATE FUNCTION closestRating (city varchar(20)) RETURNS VARCHAR(20) AS $$
DECLARE minimum real;
DECLARE rat real;
BEGIN
SET minimum = -1;
FOR r.city, rating IN (SELECT r.city, r.rating FROM rankings r)
LOOP
IF city = r.city
BEGIN
SET rat = rating;
END IF;
END LOOP;
FOR rating IN (SELECT r.city, r.rating FROM rankings r, league l WHERE r.city = l.city)
LOOP
IF minimum = -1 OR minimum < ABS(rat – rating)
BEGIN
SET minimum_dist = ABS(r – rating);
SET rat = rating;
END IF;
END LOOP;
RETURN (SELECT team from rankings, league WHERE rating = rat));
END;
$func$
LANGUAGE plpgsql;
спросил(а)
2015-11-17T22:18:00+03:00
5 лет, 3 месяца назад
добавить комментарий
пожаловаться
Решение
94
Учитывая эти данные:
create table league (
city varchar(20),
team varchar(20)
);
create table rankings (
city varchar(20),
rating real
);
insert into rankings (city, rating) values
('citya', 1),('cityb', 1.1),('cityc', 1.01),('cityd', 1.102),('citye', 1.2)
;
insert into league (city, team) values
('citya', 'teama'),('cityc', 'teamc'),('citye', 'teame')
;
Этот запрос вернет ожидаемый результат:
with given_city as (
select rating, city
from rankings
where city = 'citya'
)
select l.team
from
league l
inner join
rankings r using (city)
cross join
given_city gc
order by abs(r.rating - gc.rating)
limit 1
;
team
-------
teama
ответил(а)
2015-11-17T23:21:00+03:00
5 лет, 3 месяца назад
добавить комментарий
пожаловаться
Ваш ответ
Еще в рубрике
127
Как периодически обновлять тестовую базу данных производственными данными в Postgresql?
105
Gettin значение из таблицы и использование в одном запросе
74
Добавление категориальной переменной в зависимости от времени в Postgresql
75
PostgreSQL - средство мониторинга открытых источников для окон (без Apache)
- Вопросы
- Postgresql
- Функция, которая возвращает ближайшую рейтинговую команду города в Postgres