我有一个名为'Days'的表,这样设置(Day列是类型DateTime):
wire-tap
我要做的是,当给定User_ID和特定日期时,获取最近的“Day”IF,并且仅当用户没有任何“Day”等于或等于给定日期时。< / p>
例如,给定User_ID | Day
----------------------------------
39 | 2010-05-16 00:00:00.000
39 | 2009-05-16 00:00:00.000
40 | 2008-06-12 00:00:00.000
40 | 2008-10-07 00:00:00.000
41 | 2010-04-10 00:00:00.000
41 | 2010-03-02 00:00:00.000
42 | 2010-08-12 00:00:00.000
42 | 2011-09-15 00:00:00.000
和User_ID = 39
,由于date = 2010-05-15
列出的“日期”日期之一在给定日期User_ID = 39
之后,因此不应返回任何内容。但是,如果2010-05-15
,它将返回User_ID = 40
,因为这是在给定日期2008-10-07
之后不等于OR的最近日期。
到目前为止,我有这个,但我不知道如何添加“if”子句。下面只返回给定用户的最新日期。
2010-05-15
之后它会像 SELECT MAX(Day) from Days WHERE User_ID = 39
这样做的正确方法是什么?
答案 0 :(得分:2)
试试这个:
SELECT MAX([Day]) as TheDay FROM Days
WHERE User_ID = 39
AND [Day] < '20100515'
AND NOT EXISTS (SELECT 1 FROM Days WHERE User_ID = 39 AND [DAY] >= '20100515')
使用CTE:
with CTE(User_ID, [Day]) as
(
SELECT * FROM Days WHERE User_ID = 39
)
SELECT MAX([Day]) as TheDay FROM CTE
WHERE [Day] < '20100515'
AND NOT EXISTS (SELECT 1 FROM CTE WHERE [DAY] >= '20100515')
答案 1 :(得分:1)
未经测试:
一般逻辑:生成一组具有每个用户最大日期的数据,然后将该集限制为仅包含日期少于所需日期且所需用户的记录。
一种方法是使用内联视图和自联接。在我的例子中,我调用了内联视图B.在其中我从日期获得最大日期和用户。
然后,根据列出的用户和日期加入回天,仅返回用户的最大日期。然后我们限制用户和最大日期期望。如果最大日期小于所需日期,则返回记录。如果最大日期为&gt; =日期,则不会返回该用户的记录。
SELECT d.day
FROM days d
INNER join (SELECT user_ID, max(date) mdate
FROM days
GROUP BY user_ID) B
on d.user_ID = b.user_ID
and b.mdate = d.day
WHERE d.day < 'inputdate'
and d.user_ID = 'userid'
或者更简单......
由于您希望每个用户的最大日期,但仅当他们的日期不大于所需日期时...只需返回任何用户的最大日期,然后消除那些&gt;所需用户的所需日期。
SELECT mdate
FROM (SELECT user_ID, max(date) mdate
FROM days
GROUP BY user_ID) B
WHERE mdate <= 'datedesired'
and user_ID = 'user_ID_Desired'
答案 2 :(得分:0)
您需要在WHERE子句中添加日期条件
SELECT MAX(Day) from Days WHERE User_ID = 39 AND Day < yourInputDate