查询日期范围或最近日期范围之间的活动记录

时间:2014-07-02 15:26:13

标签: sql sql-server

我需要找到介于包含应用程序的表中的一系列日期参数之间的活动记录。首先,我在名为' app_notes'的表格中查找日期范围之间的记录。并检查是否链接到应用程序。如果日期范围内没有app_note记录,我必须查看日期范围之前的最新应用说明。如果此应用笔记指示处于活动状态,请选择它。

app_indiv表将个人连接到应用程序。每个人可以有多个app_indiv记录,每个app_indiv可以有多个app_notes。以下是我到目前为止的情况:

SELECT DISTINCT individual.indiv_id
    FROM individual INNER JOIN 
    app_indiv ON app_indiv.indiv_id = individual.indiv_id INNER JOIN
    app_note ON app_indiv.app_indiv_id = app_note.app_indiv_id
    WHERE (app_note.when_mod BETWEEN @date_from AND @date_to)
    /* OR most recent app_note indicates active */

如果日期范围内没有app_note记录,如何获取最新的app_note记录?由于可能有多个app_note记录,我不知道如何让它只检索最新的记录。

3 个答案:

答案 0 :(得分:0)

(未经测试)您需要使用CASE开关。

SELECT DISTINCT individual.indiv_id
FROM individual INNER JOIN 
app_indiv ON app_indiv.indiv_id = individual.indiv_id INNER JOIN
app_note ON app_indiv.app_indiv_id = app_note.app_indiv_id
WHERE (CASE WHEN app_note.when_mod BETWEEN @date_from AND @date_to 
                THEN (SELECT appnote.when_mod from individual where appnote.when_mod BETWEEN @date_from AND @date_to)
            WHEN app_note.when_mod NOT BETWEEN @date_from and @date_to 
                THEN (SELECT appnote.when_mod from individual appnote.when_mod LIMIT 1))

查询可能不正确。切换可能需要位于查询的第一个SELECT部分​​。

答案 1 :(得分:0)

在我看来,您真的只关心日期范围的结束日期,因为如果该日期范围内没有任何内容,您希望能够向后看。我会使用CTEROW_NUMBER()函数。 CTE只是编写子查询的一种更简洁的方法(在这种情况下,CTE可以做更多事情)。 Row_Number函数将根据order by语句对行进行编号。每次在该列中点击新值时,partition by会将编号重置为一。

with AppNoteCTE as
(select
<not sure what columns you need here>
app_indiv_id,
ROW_NUMBER() OVER (PARTITION BY APP_INDIV_ID ORDER BY WHEN_MOD DESC) RN
FROM
APP_INDIV
WHERE
WHEN_MOD <= @endDate)

SELECT DISTINCT individual.indiv_id
    FROM individual INNER JOIN 
    app_indiv ON app_indiv.indiv_id = individual.indiv_id INNER JOIN
    AppNoteCTE ON app_indiv.app_indiv_id = AppNoteCTE .app_indiv_id
    and AppNoteCTE.RN = 1

答案 2 :(得分:0)

SELECT * 
FROM individual i
INNER JOIN app_indiv ai
    ON ai.indiv_id = i.indiv_id
OUTER APPLY
(
    SELECT TOP 1 * FROM app_note an
    WHERE an.app_indiv_id = ai.app_indiv_id
        AND an.when_mod < @date_to
    ORDER BY an.when_mod DESC
) d
WHERE d.status = 'active'

查找小于结束日期的最后一个音符,检查它是否有效,如果是,则显示单个记录。