Window 函数获取每组的第一行和最后一行

Window function get first and last row from each group

我在 presto 上使用 window 函数来获取每组的第一行和最后一行。我确实在我的 Name 列上应用 ROW_NUMBER() 进行分区 Percent 列排序,结果低于结果

当前查询:

SELECT Name, Price, Percent, Volume, time, date,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Percent DESC) AS rn
FROM TABLE_NAME  ORDER BY Name asc

当前输出:

Name    Price   Percent  Volume              time          date    rn
AABB    0.015   42.55   25980719    2020-12-29 10:23:11 2020-12-29  1
AABB    0.014   33.33   22640655    2020-12-29 10:20:42 2020-12-29  2
AABB    0.014   33.33   22640655    2020-12-29 10:21:11 2020-12-29  3
AABB    0.0137  30.0    21466099    2020-12-29 10:19:20 2020-12-29  4
AABB    0.0135  28.57   20461208    2020-12-29 10:17:19 2020-12-29  5
AABB    0.013   23.81   20201208    2020-12-29 10:16:41 2020-12-29  6
AABB    0.013   23.81   19129182    2020-12-29 10:15:20 2020-12-29  7
AABB    0.0125  19.05   14513969    2020-12-29 10:07:15 2020-12-29  8
AABB    0.0125  19.05   15580088    2020-12-29 10:09:14 2020-12-29  9
AABB    0.012   14.29   14313969    2020-12-29 10:06:44 2020-12-29  10
AABB    0.012   14.29   12924448    2020-12-29 10:15:14 2020-12-29  11
ABQQ    0.025   74.83   6809380     2020-12-29 09:50:04 2020-12-29  1
ABQQ    0.024   67.83   4196759     2020-12-29 09:48:10 2020-12-29  2
ABQQ    0.0225  57.34   935554      2020-12-29 09:06:13 2020-12-29  3
ABQQ    0.0143  -5.61   1600927     2020-12-29 09:43:51 2020-12-29  4
ABQQ    0.0143  -5.61   1600927     2020-12-29 09:41:51 2020-12-29  5
ABQQ    0.0143  -5.61   1600927     2020-12-29 09:36:52 2020-12-29  6

预期输出 1:(仅按 百分比 和 select 排序 最高+最低百分比值行)

Name    Price   Percent  Volume              time          date    rn
AABB    0.015   42.55   25980719    2020-12-29 10:23:11 2020-12-29  1
AABB    0.012   14.29   12924448    2020-12-29 10:15:14 2020-12-29  11
ABQQ    0.025   74.83   6809380     2020-12-29 09:50:04 2020-12-29  1
ABQQ    0.0143  -5.61   1600927     2020-12-29 09:36:52 2020-12-29  6

预期输出 2:(仅按 时间 和 select 排序 最高+最低时间值行)

Name    Price   Percent  Volume              time          date    rn
AABB    0.015   42.55   25980719    2020-12-29 10:23:11 2020-12-29  1
AABB    0.012   14.29   14313969    2020-12-29 10:06:44 2020-12-29  10
ABQQ    0.025   74.83   6809380     2020-12-29 09:50:04 2020-12-29  1
ABQQ    0.0225  57.34   935554      2020-12-29 09:06:13 2020-12-29  3

您需要一个子查询:

SELECT Name, Price, Percent, Volume, time, date,
FROM (SELECT t.*,
               ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Percent) AS seqnum_asc,
               ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Percent DESC) AS seqnum_desc
      FROM TABLE_NAME t
     ) t
WHERE 1 IN (seqnum_asc, seqnum_desc)
ORDER BY Name asc;

如果你想time作为一个单独的查询,只需调整windowing子句中的ORDER BY即可。如果你想在一个查询中全部使用,则添加两个基于 time.

的新“seqnum”