作为查询的一部分,我有一堆不同的值:
a d
a e
a f
b g
b h
c i
我希望能够计算相对于第一个字段的计数器:
a d 1
a e 2
a f 3
b g 1
b h 2
c i 1
我无法使用临时表中的位置 - 除了它过高的任何其他位置,而我需要的值不能超过2位数(并且不会有超过50个条目相同的第一个领域。是否有任何方法或技术可以帮助?
感谢您的帮助!
答案 0 :(得分:1)
select t1.c1 , t1.c2 , count(t2.c1) cnt
from mytable t1
join mytable t2 on t1.c1 = t2.c1 and t1.c2 >= t2.c2
group by t1.c1, t1.c2
order by t1.c1, cnt
<强>解释强>
此查询假定货币对(c1,c2)
是唯一的。
要对每行(c1,c2)
进行排名,查询会计算c1
小于或等于c2
的群组c2
内的行数。例如,对于(a,e)
,组a
中有2行小于或等于e
(即d
和e
)。< / p>
答案 1 :(得分:0)
您没有指定DBMS,因此这是ANSI SQL:
select a,
b,
row_number() over (partition by a order by b) as idx
from the_table;
SQLFiddle:http://sqlfiddle.com/#!15/4cf96/1
row_number()
是一个窗口函数,它将根据&#34;分组&#34;生成一个唯一的数字。和使用partition by
子句定义的排序。 Postgres手册对窗口函数进行了很好的介绍:http://www.postgresql.org/docs/current/static/tutorial-window.html
这比自我加入要快得多