Re: window function help
От | Andy Colson |
---|---|
Тема | Re: window function help |
Дата | |
Msg-id | 533D8532.8040201@squeakycode.net обсуждение исходный текст |
Ответ на | window function help ("Schnabel, Robert D." <schnabelr@missouri.edu>) |
Ответы |
Re: window function help
|
Список | pgsql-general |
On 4/3/2014 10:27 AM, Schnabel, Robert D. wrote: > Hi, > > I'm trying to figure out how to count the number of rows within a fixed range of the current row value. My table lookslike this: > > SELECT chr_pos > FROM mutations_crosstab_9615_99 > WHERE bta = 38 > LIMIT 10 > > chr_pos > 138 > 140 > 163 > 174 > 187 > 187 > 188 > 208 > 210 > 213 > > chr_pos is integer and represents the base pair position along a chromosome. > > It looks to me like a window function would be appropriate but I cannot figure out the correct syntax. What I want todo is count the number of rows within +/- 20 of chr_pos (the current row). Given the above example, for chr_pos = 138I want the count of rows between 118 and 158. For chr_pos 187 I want the count of rows between 167 and 207 etc for allrows. The result I'm looking for should look like the following: > > chr_pos,num_variants > 138,2 > 140,2 > 163,2 > 174,4 > 187,4 > 187,4 > 188,4 > 208,6 > 210,3 > 213,1 > > Is there a way to do this with a window function? Any help would be appreciated. > > Thanks > Bob > > > > Don't think a window function is needed, how about this: select chr_pos, ( select count(*) from mutant b where b.chr_pos between a.chr_pos-20 and a.chr_pos+20 ) from mutant a; Here's what I get. I dont remember if "between" is inclusive on both sides or not, but you can change it to suit your needs. This is the answer I got, which is different than yours, but I think its right. chr_pos | count ---------+------- 138 | 2 140 | 2 163 | 2 174 | 4 187 | 3 188 | 4 208 | 5 210 | 4 212 | 4 213 | 4 (10 rows) -Andy
В списке pgsql-general по дате отправления: