首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂的SQL查询(至少对我来说是这样)

复杂的SQL查询(至少对我来说是这样)
EN

Stack Overflow用户
提问于 2009-02-02 16:18:08
回答 11查看 1.2K关注 0票数 3

我正在尝试开发一个sql查询,它将返回一个序列号列表。设置该表时,只要序列号达到某个步骤,就会输入日期和时间。完成该步骤后,将输入另一个日期和时间。我想开发一个查询,该查询将给出已进入该步骤但未退出该步骤的序列号的列表。他们可能会多次输入,所以我只查找没有出口的序列号,然后输入。

例如(为方便使用,请将该表称为"Table1")

代码语言:javascript
复制
 1. Serial | Step  | Date

 2. 1      | enter | 10/1
 3. 1      | exit  | 10/2
 4. 1      | enter | 10/4
 5. 2      | enter | 10/4
 6. 3      | enter | 10/5
 7. 3      | exit  | 10/6

对于上表,应检索序列号1和2,但不应检索序列号3。

这可以在带有子查询的单一查询中完成吗?

EN

回答 11

Stack Overflow用户

发布于 2009-02-02 16:26:11

代码语言:javascript
复制
select * from Table1 
group by Step 
having count(*) % 2 = 1

这是指不能有两个“enter”,但每个enter后面都有一个“exit”(如所提供的示例所示)

票数 4
EN

Stack Overflow用户

发布于 2009-02-02 16:36:31

就我个人而言,我认为这最好是通过改变数据存储的方式来完成的。当前的方法不是有效的或有效的。是的,你可以胡乱摆弄,找到一种方法把数据弄出来。但是,如果有多个输入步骤,但同一serialNO没有退出,会发生什么情况呢?是的,它不应该发生,但迟早会发生,除非你编写了防止它的代码(编写起来会变得复杂的代码)。如果有一个表在同一条记录中同时存储进入和退出,这样会更干净。然后,查询(并且速度快得多)以查找那些已进入但未退出的内容就变得很简单。

票数 4
EN

Stack Overflow用户

发布于 2009-02-02 16:24:05

这将给你所有没有结尾“退出”的“回车”记录。如果您只需要序列号列表,则还应按序列号分组,并仅选择该列。

代码语言:javascript
复制
SELECT t1.* 
FROM Table1 t1
LEFT JOIN Table1 t2 ON t2.Serial=t1.Serial 
    AND t2.Step='Exit' AND t2.[Date] >= t1.[Date]
WHERE t1.Step='Enter' AND t2.Serial IS NULL
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/503781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档