2016-07-23 87 views
1

今天早些時候我遇到了這個挑戰。SQL-簡單但棘手的查詢挑戰

編寫一個SQL查詢: 使用date_added但 保持最古老的this_flag值保持每條記錄的最新版本。 只有[Name][DOB][ID]被用來確定一個記錄

CREATE TABLE [Table C](
    [Date_added] [varchar](50) NULL, 
    [this_flag] [varchar](1) NULL, 
    [Name] [varchar](50) NULL, 
    [DOB] [int] NULL, 
    [ID] [int] NULL) ; 

Date_added this_flag  Name    DOB   ID 
20150501 Y    Jingleheimerscmidt 19901002 3 
20150501 N    Jingleheimerscmidt 19901002 3 
20150505 Y    Jon     19901001 1 
20150501 N    Jon     19901002 1 
20150501 Y    Jacob    19901001 2 
20150505 N    Jingleheimerscmidt 19901001 3 
20150501 Y    Jingleheimerscmidt 19901001 3 

的獨特性這是我做過什麼

SELECT * FROM Table_C where ID < 3; 

我知道這個邏輯是不正確的。但所有其他語法只是
沒有削減它。 有誰知道如何爲此編寫正確的SQL查詢?

+1

你想要什麼輸出?問題不明確 – mohan111

+0

輸出將是一個SQL查詢,它(1)使用date_added顯示每個記錄的最新版本,並且(2)保留最舊的this_flag值。僅使用[Name],[DOB]和[ID]來確定唯一記錄記錄 – Koda

+1

可以請你發佈輸出?你的意思是旗幟 – mohan111

回答

1

檢查了這一點(假設你有SQL Server版本2012或更高版本)

TT採用的分析功能First_Val以獲取「this_flag」欄和RANK函數的最早的記錄排名基於日期降序順序加入使最新的日期始終與排名進來= 1

SELECT * from 
(
    Select * , FIRST_VALUE(this_flag) OVER (PArtition By Name, ID Order by Date_Added) FirstVal_this_flag 
    , RANK() OVER (PArtition By Name, ID Order by Date_Added desc) as Rnk 
    from Table_C C 
) a 
Where Rnk = 1 

編輯:前兩排的樣品中具有相同的DATE_ADDED價值和PK的也是相同的。也許這是你的問題中的一個錯字,但無論如何這個查詢下面也會處理這種情況。在Date_Added排序後,它只需要SQL引擎返回的第一個this_flag。

SELECT Distinct Date_Added , Name, DoB, ID, FirstVal_this_flag from 
(
    Select * , FIRST_VALUE(this_flag) OVER (PArtition By Name, DoB, ID Order by Date_Added) FirstVal_this_flag 
    , RANK() OVER (PArtition By Name, DoB, ID Order by Date_Added desc) as Rnk 
    from Table_C C 
) a 
Where Rnk = 1 
+0

謝謝@objectNotFound。這次'找到對象' - 這個語法有效。我研究這個邏輯,試圖讓它工作;但它很棘手。我做了一個SELECT語句併產生了所需的輸出。然而,邏輯依然躲避我。添加rnk列很有幫助。我傾向於做一個自我加入。我很感謝你的洞察力 – Koda

+0

@Koda你是最受歡迎的。加1提出一個棘手的問題。我喜歡這個。 – objectNotFound