【问题标题】:SQL - how to select the last 5 values regardless of recordsSQL - 无论记录如何,如何选择最后 5 个值
【发布时间】:2019-02-05 15:16:59
【问题描述】:

我需要粉碎记录,所以我有每个字段的最新 5 个值,不包括空值和空白。预期的结果将产生一个这样的表格:

  1. HT |重量 |体重指数 |英国石油公司人力资源 | RR

  2. 72 | 148 | 20.07 | 120/70 | 68 | 16

  3. 72 | 152 | 20.61 | 120/80 | 68 | 16

  4. 72 | 154 | 20.88 | 120/68 | 70 | 16

  5. ...

    这里是已经按日期排序的示例数据集。

【问题讨论】:

  • SQL 表代表 无序 集。没有最后五行之类的东西,除非一列指定了顺序。
  • 数据是否有个人的 ID#,以及每一行的日期/时间?我们如何确定“最近的 5 个”、“最近的 5 个”???
  • 我遗漏了一个名为 visitdate 的列 - 我确实按 visitdate desc 排序。所以最后 5 个是最近的 5 个 - 为混淆道歉
  • 如果按visitdate最近的5个对你有用,那么你可以按visitdate排序,降序,限5个,如Gordon's answer所示
  • 查看新标签.....

标签: sql mariadb greatest-n-per-group


【解决方案1】:

SQL 表代表无序 集合。没有最后五行之类的东西,除非一列提供了该信息。假设您有这样的专栏。

这是你想要的吗?

select t.*
from t
where ht is not null and wt is not null and bmi is not null
order by ? desc
limit 5;

这是你想要的吗?

编辑:

我想我误解了这个问题。您似乎希望每列独立。为此,我认为union all 和group by 可能比较合适:

select max(ht) as ht,
       max(wt) as wt,
       max(bmi) as bmi,
       . . .
from ((select (@rnh := @rnh + 1) as rn, ht, null as wt, null as bmi, . . .
       from t cross join (select @rnh := 0) params
       where ht is not null
       order by ? desc
       limit 5
      ) union all
      (select (@rnw := @rnw + 1) as rn, null, wt, null as bmi, . . .
       from t cross join (select @rnw := 0) params
       where wt is not null
       order by ? desc
       limit 5
      ) union all
      (select (@rnb := @rnb + 1) as rn, null as ht, null as wt, bmi, . . .
       from t cross join (select @rnb := 0) params
       where ht is not null
       order by ? desc
       limit 5
      ) union all
      . . .
     ) x
group by rn;

? 用于指定排序的列。

【讨论】:

  • 编辑了我的意思是最近的 5 条记录(例如主键或 id 或访问日期)
  • @ValerioZhang 。 . .编辑后的版本是否符合您的要求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2011-09-13
  • 2018-10-12
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多