当前位置: 首页 > 面试题库 >

查询SQL中的行顺序

陶泳
2023-03-14
问题内容

假设我将events与关联users的表存储如下(dt代表事件的时间戳):

| dt | user | event |
|  1 |  1   |   A   |
|  2 |  1   |   D   |
|  3 |  1   |   B   |
|  4 |  1   |   C   |
|  5 |  1   |   B   |
|  6 |  2   |   B   |
|  7 |  2   |   B   |
|  8 |  2   |   A   |
|  9 |  2   |   A   |
| 10 |  2   |   C   |

这样我们可以说:

  • 用户1具有ADBCB的事件序列
  • 用户2具有事件序列BBAAC

我想针对这些用户回答的问题类型非常容易表达为事件序列的常规表达式,例如“哪些用户的事件序列与A. * B匹配?” 或“哪些用户的事件序列与A [^ C] * B [^ C] * D匹配?” 等等。

在此表结构上可以用来回答类似查询的SQL技巧或运算符是什么?

有没有一种方法可以有效/动态地生成user-to-表,event-sequence然后可以使用正则表达式查询该表?

我目前正在使用Postgres,但我很想知道是否有任何较大的DBMS(例如SQLServer或Oracle)也为此配备了专门的运算符。


问题答案:

使用Postgres 9.x,这实际上很容易:

select userid, 
       string_agg(event, '' order by dt) as event_sequence
from events
group by userid;

使用该结果,您现在可以在event_sequence上应用正则表达式:

select * 
from (
  select userid, 
         string_agg(event, '' order by dt) as event_sequence
  from events
  group by userid
) t
where event_sequence ~ 'A.*B'

使用Postgres
8.x,您需要找到string_agg()函数的替代品(仅适用于google,那里有很多示例),并且需要进行子选择以确保聚合的排序为8.x确实支持order by汇总功能。



 类似资料:
  • 问题内容: 如果我构建自己的函数“ myfunction”并执行以下查询: 如果mytable有100万行,但是在我之后只有100行。当我执行此查询时,myfunction将执行100或100万行吗? 在这种情况下会发生什么? 问题答案: 在第一个示例中,它将仅执行100次。您可以通过在函数中添加调试调用来验证这一点: 仅针对与子句筛选器匹配的行调用该函数。但是,据我所知,这并不能保证。 在第二个

  • 问题内容: 假设我有一个查询“ select * from子句,其中id在(0,2,5,1,3)中”,我实际上希望返回的行以它们在where子句中指定的相同顺序返回。ID的顺序将随查询的不同而改变,并且该顺序没有模式。 我知道可以更改数据模型,创建临时表等。但是请相信我,这些类型的解决方案在我的情况下将行不通。我也无法在应用程序代码中更改结果对象的顺序。 我还知道,不同的数据库引擎对事物的排序方式

  • 问题内容: 如何在JDBI中使用SQL对象查询进行排序? 我想做类似的事情: 要么 问题答案: 我最近一直在探索与JDBI捆绑在一起的DropWizard,并很快遇到了同样的问题。不幸的是,JDBI的文档乏善可陈(JavaDoc和它的git存储库中的一些示例单元测试并没有单独解决),这令人失望。 这是我根据示例DAO在JDBI的Sql Object API中实现动态排序的结果: @ UseStri

  • 问题内容: 我有一个我无法解决的问题。我正在使用PHP通过数据库运行以下命令: 结果全部恢复正常,并且符合预期,但是我必须将其输入折线图中,但是当我这样做时,它们显然会反向显示,因为我有数据库按日期在DESC中返回它们,这意味着最新的将是第一个返回。 有没有一种方法可以在返回这些结果之后在将数据输入到图表之前反转它们的顺序。 这是完整的查询(请不要对使用mysql而不是mysqli进行评论,我没有

  • 问题内容: 好的,我尝试使用谷歌搜索来寻找诸如疯狂之类的答案,但是我无法解决此问题,因此我希望有人能够提供帮助。 假设我有一个用户表,非常简单的表: 我还有他们的汽车和价格表。 现在,我需要做的是这样的(可以随意重写): 哪个返回: 但是我需要某个用户的最昂贵的汽车,而不是找到的第一个条目。 那么问题来了:如何设置LEFT JOIN表由carPrice,DESC排序? 问题答案: 尝试搭配使用。

  • Query 也可以直接执行一个SQL查询,即Select命令。在Postgres中支持原始SQL语句中使用 ` 和 ? 符号。 sql := "select * from userinfo" results, err := engine.Query(sql) 当调用 Query 时,第一个返回值 results 为 []map[string][]byte 的形式。 Query 的参数也允许传