2013-06-29 49 views
1

记录我有以下SQL获得匹配的第一次约会的标准

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日AFTER和2013-7-19之前。在这种情况下,由于用户#1在2013年5月10日之前提供了他的第一个优惠,所以他不应该被包括在结果中。这个结果集应该只包含用户#3。

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

+0

你可以用where条件像job_offer_date>“2013年5月10日”和job_offer_date <“2013年5月10日” –

+0

这并不工作,由于在原来的职位的最后一句话。 –

+0

您是否需要获取user_ids或每个用户需要表中的所有行? – Alexey

回答

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; 
+0

您对用户表的猜测是正确的。尝试一下。 –

0

如果我没有记错我的SQL日期的东西,是不是这个样子:

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

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

+0

由于它不排除第一个用户,因此不起作用。他对这些评论有一个匹配,但是由于他的第一份工作,他需要被排除在外。查看原始帖子中的最后一句。 –

+0

不行,他只想查看匹配此区间的FIRST职位招聘日期 –

+0

啊,我现在明白了。我的代码只会返回用户3(因为我使用< and >来排除其他用户),但这不是一个通用的解决方案。更新。 –

0
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' 
0

它肯定会工作

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 
+0

这个答案对你有帮助吗? –

0
-------------- 
-- 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' 
+0

有没有可能做到这一点,只需选择user_id列? –

+0

@AdamLevitt您可以在列表中添加“min(job_offer_data)”。如果还需要第一份工作offer_id的job_id,那么Oleh Nechytailo的查询就是你需要的。 – Alexey

+0

如果我需要35列,会怎么样? –