当前位置: 首页 > 面试题库 >

我应该如何处理PostgreSQL中的y中的“ x个x”数据?

钱焕
2023-03-14
问题内容

我有一个表格,希望能够显示“从Y到X排名”的数据。特别是,我希望能够以一种相对有效的方式(即不选择表中的每一行)来显示单个行的数据。排名本身很简单,它是对表中单列的直接ORDER
BY。

在这方面,Postgres似乎提出了一些独特的挑战。AFAICT它没有RANK或ROW_NUMBER或同等功能(至少在8.3中,我暂时停留在此位置)。邮件列表档案中的规范答案似乎是创建一个临时序列并从中选择:

test=> create temporary sequence tmp_seq;
CREATE SEQUENCE
test=*> select nextval('tmp_seq') as row_number, col1, col2 from foo;

当我只想从表中选择一行(并且我想按PK而不是按等级选择)时,此解决方案似乎仍然无济于事。

我可以对等级进行非规范化并将其存储在单独的列中,这使得呈现数据的难度很小,但是只是重新定位了我的问题。UPDATE不支持ORDER
BY,因此我不确定如何构造UPDATE查询来设置等级(缺少选择每一行并为每一行运行单独的UPDATE的方法,这似乎使DB活动过多每次需要更新排名时触发)。

我缺少明显的东西吗?什么是正确的方法?

编辑 :显然我还不够清楚。我知道OFFSET /
LIMIT,但我看不到它如何帮助解决此问题。我不是要选择排名第X的项目,而是要选择一个任意项(例如,按其PK),然后向用户显示类似“
312中排名第43”的内容。


问题答案:

如果您想要排名,请执行以下操作

SELECT id,num,rank FROM (
  SELECT id,num,rank() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

或者,如果您确实想要行号,请使用

SELECT id,num,row_number FROM (
  SELECT id,num,row_number() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

当您在某处具有相等的值时,它们将有所不同。如果需要的话,也有density_rank()。

当然,这需要PostgreSQL 8.4。



 类似资料:
  • 问题内容: 使用math.pow或**运算符哪个更有效?我什么时候应该使用另一个? 到目前为止,我知道可以返回一个或一个,如果您使用小数,该函数将返回一个浮点数 问题答案: 使用Power运算符将更快,因为它不会产生函数调用的开销。如果您反汇编Python代码,则可以看到以下内容: 请注意,我在这里使用变量作为指数,因为类似常数的表达式实际上是在编译时求值的。 现在,实际上,这种差异并不重要,正如

  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 问题内容: 之间有什么区别: 至: ? 我会更喜欢使用带式号码?还是我必须始终将shell与method 一起使用? 问题答案: 是Java(以及许多其他语言)中按位异或(XOR)运算符。它不用于求幂。为此,您必须使用。

  • 问题内容: 我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^ 2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。 当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新- Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组

  • 问题内容: 我期望值可以交换。但是它给出x = 0和y = 1。当我尝试使用C语言时,它会给出正确的结果。 问题答案: 您的陈述大致相当于这种扩展形式: 与C语言不同,在Java中,保证二进制运算符的左操作数在右操作数之前进行求值。评估如下: 您可以反转每个xor表达式的参数顺序,以便在再次评估变量之前完成赋值: 这是一个更紧凑的版本,也可以使用: 但这是交换两个变量的真正可怕的方法。使用临时变量

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,