sql – 如何选择n组的所有记录?

前端之家收集整理的这篇文章主要介绍了sql – 如何选择n组的所有记录?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想选择前n个组的记录.我的数据如下所示:

表’跑步者’:

  1. id gid status rtime
  2. ---------------------------
  3. 100 5550 1 2016-08-19
  4. 200 5550 2 2016-08-22
  5. 300 5550 1 2016-08-30
  6. 100 6050 3 2016-09-01
  7. 200 6050 1 2016-09-02
  8. 100 6250 1 2016-09-11
  9. 200 6250 1 2016-09-15
  10. 300 6250 3 2016-09-19

表’静态’

  1. id description env
  2. -------------------------------
  3. 100 something 1 somewhere 1
  4. 200 something 2 somewhere 2
  5. 300 something 3 somewhere 3

单元ID(id)在组内是唯一的,但在其列中不是唯一的,因为该组的实例是定期生成的.组ID(gid)分配给每个单元,但不会在多个实例上生成.

现在,组合表并选择所有内容或按特定值过滤很容易,但如何选择所有记录,例如前两个组而不直接引用组ID?
预期结果将是:

  1. id gid description status rtime
  2. --------------------------------------
  3. 300 6250 something 2 3 2016-09-19
  4. 200 6250 something 1 1 2016-09-15
  5. 100 6250 something 3 1 2016-09-11
  6. 200 6050 something 2 1 2016-09-02
  7. 100 6050 something 1 3 2016-09-01

额外问题:当我过滤这样的时间范围时:

  1. [...]
  2. WHERE runner.rtime BETWEEN '2016-08-25' AND '2016-09-16'

是否有一种简单的方法可以确保群体不被切断,但是要么出现所有记录,要么根本不出现?

解决方法

您可以使用ROW_NUMBER()来执行此操作.首先,创建一个对组进行排名的查询
  1. SELECT gid,ROW_NUMBER() over (order by gid desc) as RN
  2. FROM Runner
  3. GROUP BY gid

然后使用它作为派生表来获取您的其他信息,并使用where子句过滤到您想要查看的组的数量.例如,下面将返回前5个组RN <= 5:

  1. SELECT id,R.gid,description,status,rtime
  2. FROM (SELECT gid,ROW_NUMBER() over (order by gid desc) as RN
  3. FROM Runner
  4. GROUP BY gid) G
  5. INNER JOIN Runner R on R.gid = G.gid
  6. INNER JOIN Statis S on S.id = R.id
  7. WHERE RN <= 5 --Change this to see more or less groups

关于日期的第二个问题,您可以使用如下子查询来执行此操作:

  1. SELECT *
  2. FROM Runner
  3. WHERE gid IN (SELECT gid
  4. FROM Runner
  5. WHERE rtime BETWEEN '2016-08-25' AND '2016-09-16')

猜你在找的MsSQL相关文章