我有一个面板数据集:即timesidsvalues。我想做一个基于每个日期的价值排名。我可以很简单地通过运行:

select * from tbl order by date, value

我遇到的问题是,一旦以这种方式对表排序,如何检索每个组的行号(即,对于每个日期,我希望有一个名为ranking的列,从1变为N)。
例子:
输入:
Date, ID, Value
 d1, id1, 2
 d1, id2, 1
 d2, id1, 10
 d2, id2, 11

输出:
Date, ID, Value, Rank
 d1, id2, 1, 1
 d1, id1, 2, 2
 d2, id1, 10, 1
 d2, id2, 11, 2

最佳答案

如果没有窗口函数,您可以订购tbl并使用用户变量计算分区上的排名(“日期”值):

SELECT "date",                                                -- D) Desired columns
       id,
       value,
       rank
  FROM (SELECT "date",                                        -- C) Rank by date
               id,
               value,
               CASE COALESCE(@partition, "date")
                 WHEN "date" THEN @rank := @rank + 1
                 ELSE             @rank := 1
               END AS rank,
               @partition := "date" AS dummy
          FROM (SELECT @rank := 0 AS rank,                    -- A) User var init
                       @partition := NULL AS partition) dummy
               STRAIGHT_JOIN
               (  SELECT "date",                              -- B) Ordering query
                         id,
                         value
                    FROM tbl
                ORDER BY date, value) tbl_ordered;

更新
那么,那个查询在做什么?
我们使用用户变量“循环”排序的结果集,根据结果集(在@rank中跟踪)的相邻段,递增或重置计数器(@partition)。
在查询A中,我们初始化两个用户变量。在查询B中,我们按照需要的顺序获取表的记录:先按日期,然后按值。A和B一起构成派生表tbl_ordered,如下所示:
rank | partition | "date" |  id  | value
---- + --------- + ------ + ---- + -----
  0  |   NULL    |   d1   |  id2 |    1
  0  |   NULL    |   d1   |  id1 |    2
  0  |   NULL    |   d2   |  id1 |   10
  0  |   NULL    |   d2   |  id2 |   11

记住,我们并不真正关心列dummy.rankdummy.partition-它们只是我们初始化变量@rank@partition的意外。
在查询C中,我们循环遍历派生表的记录我们所做的或多或少是以下伪代码所做的:
rank      = 0
partition = nil

foreach row in fetch_rows(sorted_query):
  (date, id, value) = row

  if partition is nil or partition == date:
    rank += 1
  else:
    rank = 1

  partition = date

  stdout.write(date, id, value, rank, partition)

最后,query D从C中投影所有列,除了包含@partition的列(我们将其命名为dummy,不需要显示)。

关于mysql - 组内的MySQL排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8394295/

10-12 05:24