繁体   English   中英

选择前两个不同的事件并返回rowid

Select first two distinct occurrences and return rowid

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一张这样的桌子:

room_id | name    | time
1       | Kate    | 2019-09-18 10:00:00.000
1       | Michael | 2019-09-18 12:00:00.000
1       | George  | 2019-09-18 14:00:00.000
2       | Tom     | 2019-09-17 09:00:00.000
2       | Ben     | 2019-09-17 15:00:00.000
3       | Joerge  | 2019-09-16 17:00:00.000

我想选择前N个不同的room_id和最后一个的row_id。 例如,我要选择前两个不同的rooms_id,然后返回最后一个的row_id。 结果应为:

room_id
1
2

row_id应该与此记录标识:

2       | Ben     | 2019-09-17 15:00:00.000

我已经写了我的SQL语句,但是它不起作用:

SELECT distinct room_id
  FROM (
    SELECT DISTINCT room_id, time,
    rn = ROW_NUMBER() OVER (PARTITION BY room_id ORDER BY room_id, time)
    FROM tab
  ) AS sub
  WHERE rn <= N;

“ N”是我要选择多少个不同的room_id的值。 我也不知道如何返回上一条记录的row_id。

2 个回复

这是一个选择:

SQL>  set ver off
SQL>
SQL> with test (room_id, name, time) as
  2    (select 1, 'Kate'   , to_date('18.09.2019 10:00', 'dd.mm.yyyy hh24:mi') from dual union all
  3     select 1, 'Michael', to_date('18.09.2019 12:00', 'dd.mm.yyyy hh24:mi') from dual union all
  4     select 1, 'George' , to_date('18.09.2019 14:00', 'dd.mm.yyyy hh24:mi') from dual union all
  5     select 2, 'Tom'    , to_date('17.09.2019 09:00', 'dd.mm.yyyy hh24:mi') from dual union all
  6     select 2, 'Ben'    , to_date('17.09.2019 15:00', 'dd.mm.yyyy hh24:mi') from dual union all
  7     select 3, 'Joerge' , to_date('16.09.2019 17:00', 'dd.mm.yyyy hh24:mi') from dual
  8    ),
  9  rn_room as
 10    (select room_id,
 11            row_number() over (order by room_id) rnr
 12     from (select distinct room_id from test)
 13    ),
 14  rn_time as
 15    (select room_id, name, time,
 16            row_number() over (partition by room_id order by time desc) rnt
 17     from test
 18    )
 19  select r.room_id, t.name, t.time
 20  from rn_time t join rn_room r on r.room_id = t.room_id
 21  where r.rnr <= &N
 22    and t.rnt = 1;
Enter value for n: 2

   ROOM_ID NAME    TIME
---------- ------- ----------------
         1 George  2019-09-18 14:00
         2 Ben     2019-09-17 15:00

SQL>
  • rn_room房间rn_room排序
  • rn_time按时间对每个房间的名称rn_time排序
  • 最终select将这两个数据集连接起来

您可以按照这种方式尝试:

with t1 as
(
  select t.*,
         row_number() over (partition by room_id order by room_id, time desc) as rn
    from tab t
) 
select room_id, name, time
from t1
where rn = 1 and room_id = N

演示版

感兴趣的重要点是考虑在row_number()分析函数中order by time desc并为外部查询获取rn = 1

1 选择前两个元素

嗨,我有一张桌子有这个元素 在这个例子中,我必须执行一个查询,查询第一个元素,最后一个2 我能怎么做? 谢谢 ...

2 Javascript从数组中选择前两个

上面目前有k和A作为keys但这些周期性地改变。 所以我希望有人可以帮助我解决我的问题。 我目前只使用data.k和data.A来获取数组中的值,但是可以只选择前两个并将它们设置为变量而不知道键名吗? ...

3 选择两个变量的前N个

我在SQL表中有以下示例 我想展示的是每个客户的前2个产品,每个组按销售额降序排列,即 我假设我需要声明两个变量Cust和Group,但我不确定如何一口气完成它。 道歉的问题很深...没有借口。 谢谢你的帮助。 ...

4 选择数组元素或删除前两个

我正在改编生成缩略图的wordpress插件。 多亏了这个网站,我的美感才得以提高,但我陷入了一个问题。 该插件从帖子中的第一张图片生成缩略图。 我需要从第三张图像生成的图像。 帖子内容 原始代码 我已经尝试了两件事 不生成缩略图。 现在,我试图在获取U ...

5 css或xpath:选择前两个元素

我练习Scrapy,并想问一个问题: 我要剪贴的网站具有以下结构: 但是我只想要第一个2 href元素(movie和MovieEN)而没有最后一个(请参阅更多),我该怎么办? 这是我的代码,不起作用 ssel.css("td.c3 a:nth-child(-n+3)::te ...

6 总结字典的前两个选择

字母是商品名称,[]括号中的第一个字段是商品的类别,[]括号中的第二个字段是价格,第三个是已售出的数字。 我想获得每个类别中价格最高的前两种商品。 如果每个类别中至少没有两个商品,则将其删除。 所以我应该得到以下结果。 您能帮我些什么代码,以方便实现吗? 我需要一个不仅可以 ...

8 返回数组中的前两个奇数

我必须运行一个代码来挑选数组中的奇数,并返回该数组中的前两个奇数。 我已经想出了如何从数组中返回所有奇数,而不是前两个。 到目前为止的代码: 任何帮助,将不胜感激! ...

9 Android Google Maps LocationManager返回我两个小时前的位置

我正在开发一款可以在一个地方显示地图并记录用户当前位置的应用程序。 我的手机ATM上有此应用。 两个小时前,我穿过了市中心的公园。 我一直都启用移动网络,WiFi禁用了几天,GPS也禁用了。 去了离那个地方10公里的家。 启动应用程序,打开地图片段,似乎最后一个已知的位 ...

10 为什么前两个查询什么都不返回?

由于某些原因,前两个查询没有显示任何内容。 我这样做的目的是,您可以按下提交按钮来发布您的输入,然后对其进行控制并将其添加到数据库中。 但这是行不通的。 ...

2015-04-23 15:40:14 1 37   mysql
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM