SQL索引相对于另一个字段

时间:2014-07-07 22:02:16

标签: sql

作为查询的一部分,我有一堆不同的值:

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个条目相同的第一个领域。是否有任何方法或技术可以帮助?

感谢您的帮助!

2 个答案:

答案 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

Demo

<强>解释

此查询假定货币对(c1,c2)是唯一的。

要对每行(c1,c2)进行排名,查询会计算c1小于或等于c2的群组c2内的行数。例如,对于(a,e),组a中有2行小于或等于e(即de)。< / 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

这比自我加入要快得多