SQL按数字排序并保持分组

时间:2017-11-29 14:51:47

标签: mysql sql sorting

感谢您花时间阅读并可能回答我的问题。

我有一个排序问题,我告诉你:

我的SQL查询是:

OLD PERCENT = (x - OLD MIN) / (OLD MAX - OLD MIN)
NEW X = ((NEW MAX - NEW MIN) * OLD PERCENT) + NEW MIN

我从中获得的数据是这样的:

map_paths_reduced = map_paths[:10]  # Choosing only first 10 paths for simplicity


G = nx.DiGraph()
G.add_nodes_from(range(len(edge_labels)+1))
black_edges = [edge for edge in G.edges()]
pos = nx.random_layout(G)
G.add_edges_from(map_paths_reduced)

nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), node_size=500)
nx.draw_networkx_labels(G, pos, font_size=1)
nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=True)
nx.draw_networkx(G, pos, arrows=True)
plt.show()

我想这样:

SELECT p.advisor_create, COUNT(p.id) AS Nb, IF(p.cancel_advisor IS 
NULL, "no", "yes") AS refund
FROM payment p
WHERE p.type = 'CESSATION'
AND p.date BETWEEN '2017-01-01 00:00:00' AND '2017-11-31 23:59:59'
GROUP BY p.advisor_create, refund
ORDER BY p.advisor_create, Nb DESC

按相同"顾问"的MAX(NB)排序并将顾问的两行分组在一起。

再次感谢您的帮助。

解决方案:感谢@ gordon-linoff为此

+-------+---+------+
|advisor| NB|refund|
+-------+---+------+
| 170432| 50|    no|
| 170432|  4|   yes|
| 175222| 30|    no|
| 175222|  3|   yes|
| 182985|304|    no|
| 182985| 19|   yes|
| 362912|360|    no|
| 362912| 13|   yes|
+-------+---+------+

1 个答案:

答案 0 :(得分:2)

您可以在order by中使用子查询。这允许你这样做:

SELECT p.advisor_create, COUNT(p.id) AS Nb,
       IF(p.cancel_advisor IS NULL, 'no', 'yes') AS refund
FROM payment p
WHERE p.type = 'CESSATION' AND
      p.date >= '2017-01-01' AND 
      p.date < '2017-12-01'
GROUP BY p.advisor_create, refund
ORDER BY (SELECT COUNT(*)
          FROM payment p2
          WHERE p2.advisor_create = p.advisor_create AND
                p2.type = 'CESSATION' AND
                p2.date >= '2017-01-01' AND 
                p2.date < '2017-12-01' AND
                p2.cancel_advisor IS NULL
         ),
         p.advisor_create, Nb DESC;

这假设您要按“否”值排序。如果要按总计排序,只需从子查询中删除该条件。

另请注意,我简化了日期比较。没有理由去做秒 - 实际上,between不建议用于日期/时间比较,因为时间组件会产生混淆。