2016-09-02 3 views
0

У меня есть следующие таблицы:верхние п строки таблицы в Postgres

year | value | tercile 
------+--------+--------- 
1980 | 96.4 | 
1981 | 727 | 
1982 | 804.7 | 
1983 | 979 | 
1984 | 995 | 
1985 | 984.4 | 
1986 | 994.6 | 
1987 | 98.39 | 
1988 |  97 | 
1989 | 87.87 | 
1990 | 4054.3 | 
1991 | 82.89 | 
1992 |  94 | 
1993 | 97.61 | 
1994 | 99.68 | 
1995 | 99.9 | 
1996 | 9.42 | 
1997 | 75.66 | 
1998 | 2.16 | 
1999 | 696 | 
2000 | 99.38 | 
2001 | 9.81 | 
2002 | 99.27 | 
2003 | 2.75 | 
2004 | 12.51 | 
2005 | 9.29 | 
2006 | 994.71 | 
2007 | 97.06 | 
2008 | 64.44 | 
2009 |  95 | 
2010 | 40.88 | 
2011 | 9.46 | 
2012 | 742.86 | 
2013 | 9.5 | 
2014 | 736.38 | 
2015 | 93.13 | 

мне нужно заполнить столбец «терцилей» со значениями 1-3 в соответствии со значениями в «значение» столбца , 3 присваивается записям с 12 наивысшими значениями, 2 присваивается записям с 12 средними значениями, а 1 присваивается записям с наименьшими 12 значениями.

я могу получить эти записи со следующими запросами:

select * from trace_terciles order by value desc limit 12 
select * from trace_terciles order by value desc limit 12 offset 12 
select * from trace_terciles order by value desc limit 12 offset 24 

Но я не могу понять, как обновить результаты этих SELECT заявлений. Как я могу это сделать? Используя подзапрос?

+0

Лучший ответ зависит от нескольких вещей: Postgres версии, точное определение таблицы (PK, NOT NULL ограничения?), Фактическое количество строк. Вы хотите присвоить номера рангов всем столбцам (1-й, 2-й, 3-й и 3-й) или по 12 строк, независимо от общего количества строк? Возможно ли одновременное доступ к записи? Текущие ответы уязвимы для условий гонки с одновременным доступом к записи. Сравните: http://dba.stackexchange.com/questions/69471/postgres-update-limit-1/69497#69497 –

ответ

1

Как насчет

update trace_terciles set tercile=2 where year in (select year from trace_terciles order by value desc limit 12 offset 12) 

и аналогично для остальных 2-х случаях.

+0

работал отлично! огромное спасибо –

2

Обновить все строки в одном запросе:

update trace_tercile t 
set tercile = case 
    when rank < 13 then 3 
    when rank < 25 then 2 
    else 1 end 
from (
    select year, rank() over (order by value desc) 
    from trace_tercile 
    ) s 
where s.year = t.year; 
Смежные вопросы