按未来日期限制结果集 - SQL

时间:2015-07-29 13:21:50

标签: sql sql-server

下面的查询为SP_ScheduleEvent表中的每个条目生成一条记录。

 SELECT m.MaterialId,  m.MaterialTitle, se.EventDateTime, c.ChannelName
    FROM GB_Material m
    LEFT OUTER JOIN SP_ScheduleEvent se on se.MaterialName = m.MaterialName
    INNER JOIN SP_Schedule s on s.ScheduleID = se.ScheduleID
    INNER JOIN GB_Channel c on c.ChannelID = s.ChannelID
    WHERE LOWER(m.MaterialName) like '%foo%' OR LOWER(m.MaterialTitle) like '%foo%'

enter image description here

我想将结果集限制在最近的未来EventDateTime。

因此,根据材料名称,我希望看到一个EventDateTime,它应该是当前时间最近的未来日期。

最后,SP_ScheduleEvent表中可能不存在特定材质名称的记录,在这种情况下,EventDateTime列应返回null

SQLFiddle

我将如何做到这一点?

2 个答案:

答案 0 :(得分:0)

首先,您的 app.use(bodyParser.urlencoded({ extended: true})); // parse application/x-www-form-urlencoded app.use(bodyParser.json()); 并不重要,因为后续联接使其成为LEFT JOIN。在INNER JOIN语句中使用LEFT JOIN或切换到FROM

我认为你可以使用INNER JOIN

ROW_NUMBER()

答案 1 :(得分:0)

使用ROW_NUMBER()函数:

WITH cte AS (
 SELECT m.MaterialId,  m.MaterialTitle, se.EventDateTime, c.ChannelName,
  ROW_NUMBER() OVER (PARTITION BY m.MaterialId ORDER BY EventDateTime ASC) AS rn
    FROM GB_Material m
    LEFT OUTER JOIN SP_ScheduleEvent se on se.MaterialName = m.MaterialName
    LEFT OUTER JOIN SP_Schedule s on s.ScheduleID = se.ScheduleID
    LEFT OUTER JOIN GB_Channel c on c.ChannelID = s.ChannelID
    WHERE LOWER(m.MaterialName) like '%foo%' OR LOWER(m.MaterialTitle) like '%foo%'
    AND se.EventDateTime > GETDATE()
)
SELECT * FROM cte
WHERE rn=1