Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一列中的行号,然后使用另一列重新排序_Python_Sql_Postgresql_Sqlalchemy_Postgresql 9.3 - Fatal编程技术网

Python 一列中的行号,然后使用另一列重新排序

Python 一列中的行号,然后使用另一列重新排序,python,sql,postgresql,sqlalchemy,postgresql-9.3,Python,Sql,Postgresql,Sqlalchemy,Postgresql 9.3,我从一个采购表中汇总了一些数据,按每个地区的总金额进行汇总 数据如下所示: | id | region | purchase_amount | | 1 | A | 30 | | 2 | A | 35 | | 3 | B | 41 | 然后,聚合数据如下所示,按总购买量排序: | region | total_purchases | | B | 1238

我从一个采购表中汇总了一些数据,按每个地区的总金额进行汇总

数据如下所示:

| id | region | purchase_amount |
| 1  | A      | 30              |
| 2  | A      | 35              |
| 3  | B      | 41              |
然后,聚合数据如下所示,按总购买量排序:

| region  | total_purchases |
|   B     |  1238           |
|   A     |  910            |
|   D     |  647            |
|   C     |  512            |
我想获得每个地区的排名,按总采购量排序。目前,我可以使用SQLAlchemy使用row_number来实现这一点,结果是一个表如下所示:

| rank | region  | total_purchases |
|  1   |   B     |  1238           |
|  2   |   A     |  910            |
|  3   |   D     |  647            |
|  4   |   C     |  512            |
| rank | region  | total_purchases |
|  4   |   C     |  512            |
|  1   |   B     |  1238           |
|  2   |   A     |  910            |
|  3   |   D     |  647            |
但是,我还想对另外一个专栏进行分组,那就是: 我希望区域“C”始终是第一行,但保持其排名

这将理想地生成一个如下所示的表:

| rank | region  | total_purchases |
|  1   |   B     |  1238           |
|  2   |   A     |  910            |
|  3   |   D     |  647            |
|  4   |   C     |  512            |
| rank | region  | total_purchases |
|  4   |   C     |  512            |
|  1   |   B     |  1238           |
|  2   |   A     |  910            |
|  3   |   D     |  647            |
我可以做一个或另一个,但我似乎不能结合这两个功能在一起。如果我使用一个行数函数,我会得到正确的排序

我可以使用跨两列的排序将区域“C”行始终置于顶部:

ORDER BY
     CASE WHEN region = 'C' THEN 1 ELSE 0 DESC,
     total_purchases DESC
然而,我似乎无法将这两个需求组合到同一个查询中。

这行吗

select row_number() over (order by total_purchases desc) as rank,
       region, total_purchases
from table t
order by (case when region = 'C' then 1 else 0 end) desc, total_purchases desc;

使用CTE实现这一点,在主查询中输入行号

;WITH C AS(
    SELECT ROW_NUMBER() OVER (ORDER BY total_purchases DESC) AS Rn
           ,region
           ,total_purchases
    FROM your_table
)
SELECT *
FROM C
ORDER BY (CASE WHEN region = 'C' THEN 1 ELSE 0 END) DESC
         ,total_purchases DESC

这是关于Postgres的,我们有一个合适的类型,可以直接按任何布尔表达式排序:

选择按采购金额排序的排名\u金额描述最后为空作为排名 区域 ,合计采购金额作为采购总额 从购买 按区域分组 按区域“C”,1,区域排序;-作为平局破坏者的区域 解释 窗口函数在聚合函数之后执行,所以这里不需要子查询或CTE

最后是零

最后一个1引用选择列表中的序号位置1,因此不必重复表达式

按区域“C”排序

这似乎足够了。与行数相反,相等的总购买量排名相同。在这种情况下,若要打破可能的联系并获得稳定的结果,请添加区域或任何内容作为订购的最后一项。 如果您使用行号且仅按金额订购,则相等的总计可以在两个单独的呼叫中切换位置。您可以将另一个项目添加到row_number的ORDER BY子句中,以获得类似的结果,但我认为相等的总购买量更适合相等的排名


你在使用什么数据库?请适当标记您的问题。使用Postgres 9.3更新标记。我的答案应该适用于研究生。但是,如果需要有效的语法,应该编辑问题并显示查询;将C作为按采购总额排序的订单上的选择行,将描述为Rn,区域,按区域分组,将采购总额作为从您的表格中的采购总额,但它表示“采购总额”行尚不存在。我该怎么解决这个问题呢?Sumparchasesok的订单不是按总采购量下单,而是这样做的。现在将其集成到我们现有的SQLAlchemy代码中,效果很好。现在将其集成到现有的SQLAlchemy查询中。