楼主: addreamer
1444 9

[应用实例] 求助较为复杂的查询语句的编写 [推广有奖]

  • 1关注
  • 4粉丝

已卖:53份资源

副教授

73%

还不是VIP/贵宾

-

威望
0
论坛币
5984 个
通用积分
306.2157
学术水平
20 点
热心指数
26 点
信用等级
11 点
经验
24774 点
帖子
545
精华
0
在线时间
1298 小时
注册时间
2010-4-23
最后登录
2025-7-9

楼主
addreamer 在职认证  发表于 2024-7-1 17:05:00 |AI写论文
10论坛币
有个data数据表如下:
idtime

1

10时01分01秒

2

10时29分01秒

3

10时06分01秒

5

10时05分01秒

5

10时25分01秒

7

10时15分01秒

7

10时45分01秒

8

10时41分01秒

9

10时50分01秒

10

10时51分01秒

time时间顺序是乱的,现在要查询的是30分钟内的最大样本数量,起止点未知,最终得出的结果有三组是6,则该查询的返回结果就是6.

最佳答案

tiesuoqiao 查看完整内容

把你的数据在Excel里改了time列的格式生成了CSV文件 Book2.csv: id,time 1,10:01:01 AM 2,10:05:01 AM 3,10:06:01 AM 4,10:15:01 AM 5,10:25:01 AM 6,10:29:01 AM 7,10:41:01 AM 8,10:45:01 AM 9,10:50:01 AM 10,10:51:01 AM python代码(用了duckdb + SQL)最后结果
关键词:time Data 样本数量 IME Tim

沙发
tiesuoqiao 发表于 2024-7-1 17:05:01
tiesuoqiao 发表于 2024-7-1 20:22
思路如下,
步骤:
1.
把你的数据在Excel里改了time列的格式生成了CSV文件 Book2.csv:

id,time
1,10:01:01 AM
2,10:05:01 AM
3,10:06:01 AM
4,10:15:01 AM
5,10:25:01 AM
6,10:29:01 AM
7,10:41:01 AM
8,10:45:01 AM
9,10:50:01 AM
10,10:51:01 AM

python代码(用了duckdb + SQL)
  1. import duckdb

  2. con = duckdb.connect()

  3. df=duckdb.read_csv('Book2.csv',  dtype = ["int", "time"])

  4. SQL="SELECT MAX(c) FROM (SELECT id, count(*) AS c FROM (SELECT df.id, date_diff('minute', df.time, df2.time) AS difference FROM df, df AS df2 WHERE df.id != df2.id) AS p WHERE difference <= 30 AND difference >=-30 GROUP BY id);"

  5. duckdb.query(SQL)
复制代码
最后结果
  1. ┌────────┐
  2. │ max(c) │
  3. │ int64  │
  4. ├────────┤
  5. │      9 │
  6. └────────┘
复制代码

藤椅
addreamer 在职认证  发表于 2024-7-1 18:06:52
提供查询语句思路即可,不需要纠结于时间格式的处理。

板凳
tiesuoqiao 发表于 2024-7-1 20:22:35
思路如下,
步骤:
1.
你把这个表和它自己product,就是cross join,得到下表
id  time   id1  time1

2.
得到的每行计算time和time1的时间差,取绝对值
3.
filter:绝对值>0且小于等于30秒;上步骤如果不取绝对值就是-30到+30之间,不等于0;或者第一步加个限制 id != id1
4.
按照id,count
5
取最大值

报纸
tiesuoqiao 发表于 2024-7-1 21:15:42
tiesuoqiao 发表于 2024-7-1 20:22
思路如下,
步骤:
1.
那些过滤自己join自己的步骤可以省略
最后一步取最大值减去1就行了

地板
addreamer 在职认证  发表于 2024-7-2 09:18:51
tiesuoqiao 发表于 2024-7-1 21:15
那些过滤自己join自己的步骤可以省略
最后一步取最大值减去1就行了
请问,按照您的思路,是这个写法不?
select max(count(a.id)) from (select a.id,a.time,b.id,b.time,dtime=a.time-b.time from data a,data b) filter(where dtime >0 and dtime <=30)

max和count都是聚合函数,好像不能嵌套?数据库环境是sqlite。后面对数据表起别名是不是和cross join效果一样?

7
addreamer 在职认证  发表于 2024-7-2 09:51:08
tiesuoqiao 发表于 2024-7-2 07:40
把你的数据在Excel里改了time列的格式生成了CSV文件 Book2.csv:

id,time
感谢感谢,我试试

8
tiesuoqiao 发表于 2024-7-2 10:38:52
SQL里的date_diff就是计算两个时间的差,以分钟为单位
date_diff('minute', df.time, df2.time)

这是duckdb的函数
其他数据库的函数名字可能不同。

9
addreamer 在职认证  发表于 2024-7-25 15:53:51
感谢感谢,按照你的例子思路,把问题解决了

10
addreamer 在职认证  发表于 2024-7-25 15:54:22
tiesuoqiao 发表于 2024-7-2 10:38
SQL里的date_diff就是计算两个时间的差,以分钟为单位
date_diff('minute', df.time, df2.time)
感谢感谢,按照你的例子思路,把问题解决了

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 20:48