2014-07-02 58 views
0

我需要從包含應用程序的表中查找位於一系列日期參數之間的活動記錄。首先,我在名爲'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記錄,因此我不知道如何使其只能檢索最近的記錄。

+0

這是一個非常時髦的要求。我想說的是取最大日期,然後在此之前找到最近的有效記錄。 – Andrew

+0

您可以發佈app_note表格的表格模式,並讓我知道是否有app_note_id(或等價物)將按最近的app_note順序排列?另外,請讓我知道「最近期」的要求是指日期範圍還是最大可用時間 – AHiggins

回答

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' 

找到最後一個音符小於結束日期,檢查,看它是否活躍,如果是這樣顯示的個人紀錄。

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部分​​。

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