SQL每日一题(20201119)两个时间段内的最早的一条记录视为“有效”,在这两个时间段内其它打卡数据显示“重复”,否则视为“无效”

SQL每日一题(20210507)
SQL每日一题(20210816)
SQL每日一题(20211102)
SQL每日一题(20220415)
SQL每日一题(20211228)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select userid,
       checkin,
       case
           when (ca = '上午' and rn = 1) or (ca = '下午' and rn = 1) then '有效'
           when ca = '其他' then '无效'
           ELSE '重复' end as '状态'
from (select *,
             rank() over (PARTITION by userid,date(CheckIn),case
                                                                when time(CheckIn) BETWEEN "08:00" AND "09:00" then '上午'
                                                                when time(checkin) BETWEEN "16:30" AND "18:00" then '下午'
                                                                else '其他' END ORDER BY time(checkin) ) as rn,
             case
                 when time(CheckIn) BETWEEN "08:00" AND "09:00" then '上午'
                 when time(checkin) BETWEEN "16:30" AND "18:00" then '下午'
                 else '其他' END ca from t1119) t ORDER BY userid asc,date(CheckIn)asc ,time(checkin) asc

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SELECT t1.*,
       IF((DATE_FORMAT(t1.CheckIn, '%H:%i:%s') >= '08:00' AND DATE_FORMAT(t1.CheckIn, '%H:%i:%s') <= '09:00') OR
          (DATE_FORMAT(t1.CheckIn, '%H:%i:%s') >= '16:30' AND DATE_FORMAT(t1.CheckIn, '%H:%i:%s') <= '18:00'),
          IF(t_am_pm.UserId IS NOT NULL, '有效', '重复'), '无效') AS `状态`
FROM T1119 t1
         LEFT JOIN (
    SELECT t3.UserId, MIN(t3.CheckIn) AS CheckIn
    FROM T1119 t3
    WHERE (
                  (DATE_FORMAT(t3.CheckIn, '%H:%i:%s') >= '08:00' AND DATE_FORMAT(t3.CheckIn, '%H:%i:%s') <= '09:00')
                  OR (DATE_FORMAT(t3.CheckIn, '%H:%i:%s') >= '16:30' AND DATE_FORMAT(t3.CheckIn, '%H:%i:%s') <= '18:00')
              )
    GROUP BY t3.UserId, DATE_FORMAT(t3.CheckIn, '%Y-%m-%d%p')
) AS t_am_pm ON t1.UserId = t_am_pm.UserId AND t1.CheckIn = t_am_pm.CheckIn
ORDER BY t1.UserId ASC, t1.CheckIn ASC
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用SQL语句中的交集(INTERSECT)来描述两个人在同一段时间内同一地点住宿过的情况。具体步骤如下: 假设有两个表格,一个是"person"表格,包含人员的信息,如姓名、ID等;另一个是"accommodation"表格,包含住宿信息,如住宿时间、地点等。 1. 分别在"person"和"accommodation"表格中筛选出两个人员的记录和住宿记录,并将它们作为子查询。 例如,假设要查询ID为001和002的两个人员在2022年1月1日到2022年1月3日期间住宿的情况,可以使用以下语句: ``` SELECT accommodation.location FROM accommodation WHERE accommodation.check_in_date >= '2022-01-01' AND accommodation.check_out_date <= '2022-01-03' AND accommodation.person_id IN (SELECT person.id FROM person WHERE person.id IN ('001', '002')) ``` 2. 对上述两个子查询使用交集(INTERSECT)操作符,得到这两个人员在同一段时间内同一地点住宿过的记录。 例如,假设查询的结果为: ``` location ---------------- Hotel A Hotel B ``` 则可以使用以下语句来查询结果: ``` (SELECT accommodation.location FROM accommodation WHERE accommodation.check_in_date >= '2022-01-01' AND accommodation.check_out_date <= '2022-01-03' AND accommodation.person_id = '001') INTERSECT (SELECT accommodation.location FROM accommodation WHERE accommodation.check_in_date >= '2022-01-01' AND accommodation.check_out_date <= '2022-01-03' AND accommodation.person_id = '002') ``` 执行上述语句后,返回的结果为这两个人员在2022年1月1日到2022年1月3日期间同住的地点,即Hotel A和Hotel B。 ### 回答2: 要描述两个人在同一段时间内同一地点住宿过,可以使用SQL语言来查询需要的数据。下面是一个示例的SQL查询语句: ```sql SELECT a.person_id, b.person_id, a.room_id, a.check_in_date, a.check_out_date FROM accommodations a, accommodations b WHERE a.room_id = b.room_id -- 两人住宿地点相同 AND a.check_in_date <= b.check_out_date -- 入住A早于B离开 AND a.check_out_date >= b.check_in_date -- 离开A晚于B入住 AND a.person_id <> b.person_id -- 两人ID不同 ``` 这个查询语句使用`accommodations`表来获取住宿信息,表中包含人员ID(person_id)、房间ID(room_id)、入住日期(check_in_date)和离开日期(check_out_date)等字段。 通过将`accommodations`表自连接,即使用两个相同的表别名(a和b),可以实现两个人是否在同一段时间内住宿在同一地点。 通过`WHERE`子句中的条件来限制查询结果: - `a.room_id = b.room_id` 确定两个人住宿的地点相同; - `a.check_in_date <= b.check_out_date` 确定A的入住日期早于等于B的离开日期; - `a.check_out_date >= b.check_in_date` 确定A的离开日期晚于等于B的入住日期; - `a.person_id <> b.person_id` 排除同一个人自己住宿的情况。 最后,查询结果将返回两个人的ID、住宿地点的ID、入住日期和离开日期等信息,这些信息可以用来确认两个人在同一段时间内同一地点住宿过。 ### 回答3: 要描述两个人在同一段时间内同一地点住宿过,可以使用SQL语言查询两个表格:一个包含人员信息的表格和一个包含住宿信息的表格。 首先,将人员信息和住宿信息存储在两个表格中。人员信息表格包含以下列:人员ID、姓名等。住宿信息表格包含以下列:住宿ID、人员ID、住宿地点、开始日期和结束日期。 然后,使用SQL语言编写查询语句来筛选出满足条件的记录。查询语句如下所示: ```sql SELECT t1.姓名, t2.姓名, t2.住宿地点, t2.开始日期, t2.结束日期 FROM Person t1, Accommodation t2 WHERE t1.人员ID = t2.人员ID AND t1.姓名 <> t2.姓名 AND t2.开始日期 <= t1.结束日期 AND t2.结束日期 >= t1.开始日期 ``` 以上查询语句使用了表的连接操作(JOIN)和条件筛选。首先,通过人员ID将两个表格连接起来。然后,通过姓名不相等的条件筛选出两个不同的人员。接下来,通过日期条件筛选出满足在同一段时间内住宿的记录。 最后,查询结果将显示满足条件的两个人员的姓名、住宿地点以及开始和结束日期。 以上就是使用SQL语言描述两个人在同一段时间内同一地点住宿过的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

time丶sand

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值