PostgreSQL:对字母数字字符串和十进制字段进行排序

时间:2017-06-06 14:14:08

标签: sql postgresql sorting pg

希望你们一切顺利,做得好!

我有一张表items,其中有200万条记录,结构如下所示:

id (int) | price (decimal) | priority (int)
-------------------------------------------
10001    |  59000.25       |    1
10002    |  73000.91       |    2
10003    |  1000.23        |    1
10004    |  9567.18        |    1

我正在寻找的解决方案非常简单:如何在ASC | DESC订单上price+priority对此表进行排序?

当前和有效的解决方案:我正在使用ORDER BY priority ASC, price ASC。但据我所知,对多列进行排序是缓慢的而不是优化的方法(因此我面临实时的缓慢)。

我尝试的解决方案:我在此表中添加了一个临时列:

id (int) | price (decimal) | priority (int) | new_priority (varchar)
--------------------------------------------------------------------
10001    |  59000.25       |    1           | a59000.25
10002    |  73000.91       |    2           | b73000.91
10003    |  1000.23        |    1           | a1000.23
10004    |  9567.18        |    1           | a9567.18

我已将1 => a, 2 => b, 3 => c替换为10(我在数据库中的最大数量)

现在,每当我在SQL下面尝试时,它们都没有工作

SELECT * FROM items
ORDER BY new_priority ASC

SELECT * FROM items
ORDER BY new_priority::bytea

SELECT * FROM items
ORDER BY SUBSTRING(new_priority FROM '^(.*?)( \\d+)?$'),
     COALESCE(SUBSTRING(new_priority FROM ' (\\d+)$')::INTEGER, 0)

请指教!

我提到的链接:

  1. Postgresql sorting mixed alphanumeric data
  2. Alphanumeric Sorting in PostgreSQL
  3. Alphanumeric sorting with PostgreSQL
  4. Alphanumeric case in-sensitive sorting in postgres

3 个答案:

答案 0 :(得分:2)

如何创建index?索引是一种增强数据库性能的机制。创建索引可能很慢并且可能持续几个小时,但您会注意到进一步查询的差异。

答案 1 :(得分:0)

您可以使用NEW_PRIORITY作为DECIMAL来做更好的解决方案。

假设PRICE中的值不大于(比方说)999999且PRIORITY不太“大”,则可以使用PRIORITY*1000000+PRICE

无论如何,我认为在评论中使用索引可能是更好的解决方案。

要创建“复合索引”,您可以使用以下sintax:

CREATE INDEX index_name ON table_name (priority ASC, price ASC);

答案 2 :(得分:0)

数据多久更改一次?如果不经常,请使用function getTotalCost(item, callback) { $.ajax({ dataType: "json", url: "/retrieveData.do?item=" + item.email, success: function(data) { var totalCost = 0; for (var i = 0; i < data.length; i++) { totalCost += parseFloat(data[i].cost); } callback(totalCost); } }); } 。 请参阅:https://www.postgresql.org/docs/9.5/static/sql-cluster.html 它基本上会按索引的顺序对表进行排序。 将此群集与etsa的答案结合起来。

问题是,CLUSTER没有维持秩序。 因此,如果您插入了新行,它将被插入到最后一行。