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查询中。