【问题标题】:SQL get record that matches FIRST date criteriaSQL 获取符合 FIRST 日期条件的记录
【发布时间】:2013-06-29 19:33:17
【问题描述】:

我有以下

user_id job_id job_offer_date 
------- ------ --------------
1          123     2013-05-10 
1          124     2013-07-19
2          127     2013-05-10
3          128     2013-06-15 

我想在此处编写两个单独的查询以在报告中使用:

QUERY #1(我已经有了这个)

此查询要返回所有第一个工作邀请日期在 2013 年 5 月 10 日之前的用户。这是一个简单的查询,因为如果用户在该日期之前有任何工作,它将返回他。在这种情况下,我将看到用户 #1、#2。

这个查询看起来像这样:

SELECT DISTINCT j.* FROM job WHERE j.job_offer_date <= '2013-05-10'

QUERY #2(这是我真正的问题)

如何返回第一个工作邀请日期在 2013 年 5 月 10 日之后和 2013 年 7 月 19 日之前的用户。在这种情况下,因为用户 #1 在 2013 年 5 月 10 日之前收到了他的第一个报价,所以他不应该被包括在结果中。此结果集应仅包含用户 #3。

这里最重要的关键是因为用户 #1 在 2013 年 5 月 10 日之前收到了他的第一个报价,他应该从查询 #2 的结果集中排除

【问题讨论】:

  • 您可以使用 where 条件,例如 job_offer_date > '2013-05-10' 和 job_offer_date
  • 由于我原帖的最后一句话,这不起作用。
  • 您需要只获取 user_ids 还是每个用户都需要该表为他提供的所有行?
  • 我实际上只需要 user_ids。我需要确保我只对我的用户进行一次分桶。

标签: sql sql-server sql-server-2008 date


【解决方案1】:

一组相关的第一份工作机会。

select user_id, min(job_offer_date) as first_offer
from job
group by user_id
having min(job_offer_date) > '2013-05-10'
   and min(job_offer_date) < '2013-07-19'

加入该集合以获取用户。我猜用户数据存储在用户表中。

select u.*
from users u
inner join (select user_id, min(job_offer_date) as first_offer
            from job
            group by user_id
            having min(job_offer_date) > '2013-05-10'
               and min(job_offer_date) < '2013-07-19') o
        on o.user_id = u.user_id;

【讨论】:

  • 您对用户表的猜测是正确的。试试这个。
【解决方案2】:

如果我没记错我的 SQL 日期,它看起来会不会是这样的:

SELECT DISTINCT j.* FROM job WHERE j.job_offer_date > '2013-05-10' AND j.job_offer_data < '2013-7-19'

编辑:我误解了你的问题。以上将查找在列出的两个日期之间(但不在)有工作的任何用户。 Oleh Nechytailo 有更好的答案。

【讨论】:

  • 这不起作用,因为它不排除第一个用户。他确实符合这些标准,但由于他的第一份工作,他需要被排除在外。查看原帖的最后一句话。
  • 不,他只想检查与此时间间隔匹配的第一个工作机会日期
  • 啊,我明白了。我的代码将只返回用户 3(因为我使用 来排除其他人),但这不是一个通用的解决方案。更新中。
【解决方案3】:

一定会成功的

WITH TEMP 
AS
(
SELECT *
FROM Job AS J
)

SELECT *
FROM TEMP AS A
WHERE OFFERdATE > '2013-05-10' AND oFFERdATE < '2013-7-19' AND
1 = CASE WHEN (SELECT COUNT(*) FROM TEMP WHERE OFFERdATE <= '2013-05-10' AND USERID = A.USERID) > 0 THEN      0 ELSE 1 END

【讨论】:

    【解决方案4】:
    --------------
    -- sample data
    --------------
    declare @data table
    (
        user_id int,
        job_id int,
        job_offer_date datetime
    )
    
    insert into @data (user_id, job_id, job_offer_date) values 
        (1, 123, '2013-05-10'),
        (1, 124, '2013-07-19'),
        (2, 127, '2013-05-10'),
        (3, 128, '2013-06-15')
    
    -----------
    -- solution
    -----------
    select user_id from @data
    group by user_id
    having min(job_offer_date) > '2013-05-10' and min(job_offer_date) < '2013-07-19'
    

    【讨论】:

    • 是否可以在不选择 user_id 列的情况下执行此操作?
    • @AdamLevitt 您可以在列列表中添加“min(job_offer_data)”。如果还需要第一个工作机会的 job_id,那么 Oleh Nechytailo 的查询就是您所需要的。
    • 如果我需要 35 列怎么办?
    • @AdamLevitt 只需将它们添加到 Oleh 解决方案中的“job_offer_date”列之后。还是您的意思是另一个表中的列?
    • @AdamLevitt 对于这种情况,我想不出比 Mike 建议的更好的方法。
    【解决方案5】:
    select user_id, job_id, job_offer_date
    from 
        (select user_id
            , job_id
            , job_offer_date
            , row_number() over 
                    (partition by user_id order by job_offer_date) rown 
         from job) sub
    where sub.rown = 1 and sub.job_offer_date > '2013-05-10' and sub.job_offer_date < '2013-07-19'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多