如果该日期在给定日期之前,请获取最近的日期

时间:2016-01-14 19:15:05

标签: sql-server

我有一个名为'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

这样做的正确方法是什么?

3 个答案:

答案 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