2014-06-05 105 views
0

感謝您的時間!對於每個用戶,我希望輸出包含其最早生效日期和最後結束日期的單個列,以及此表和其他表中的其他列(這些內容對於每個用戶都是一致的)。以下是輸入數據的格式。SQL選擇不同行中的最大和最小日期

User Eff_Date  End_Date Otherstuff... 
----|-------------|------------|--------- 
001 | 20140101 | 20140106 
001 | 20140107 | 99990101 
002 | 20140201 | 20140305 
002 | 20140306 | 20140319 
002 | 20140320 | 99990101 
003 | 20140401 | 20140402 
004 | 20140501 | 20250901 

這基本上就是我希望的結果:

User Eff_Date  End_Date Otherstuff... 
----|-------------|------------|--------- 
001 | 20140101 | 99990101 
002 | 20140201 | 99990101 
003 | 20140401 | 20140402 
004 | 20140501 | 20250901 

這裏是我的嘗試:

SELECT DISTINCT M.user, T.mineffdate, T.maxenddate, A.otherstuff 


FROM tbluser M 
LEFT JOIN otherstuff A ON A.[user]=M.[user] 
INNER JOIN (SELECT user, MAX(m.end_date) as maxenddate, MIN(m.eff_date) as mineffdate FROM tbluser M GROUP BY user) T ON T.user = M.user AND T.maxenddate = m.end_date AND T.mineffdate = M.eff_date 

當我跑了這一點,用戶喜歡003和004以上的顯示沒問題,但像001和002這樣的用戶根本沒有出現。

我對SQL很新,所以我可能會犯一個非常基本的錯誤。隨時讓我知道如果是這樣的話。另外,我無法控制數據源,所以我無法在源代碼中修復此問題。我發現的唯一原因是通過使用SQL輸出每個用戶記錄,然後使用VBA來組裝記錄。不幸的是,這不是一個長期的解決方案。

請讓我知道如果您需要更多的信息,我欣賞一切,向正確的方向微調可能足以幫助我解決這個問題。再次感謝您的時間!

+0

你使用的是什麼sql平臺?使用MySQL,SQL Server等適當標記帖子等。 – paqogomez

+0

對不起,SQL-Server 2012. – Wolves

+2

好吧,「otherstuff」與最短日期或最長日期在同一行。那麼你想要哪個「otherstuff」?最小日期的日期,還是最大日期的日期?這是用戶1和用戶2遇到的問題:分鐘日期與最大日期不在同一行上! –

回答

4

如何使用窗口函數?

試試這個:

Select distinct t.[user], 
Min(t.eff_date) Over (Partition By [user]) as EffDate, 
Max(t.End_Date) Over (Partition By [user]) as EndDate, 
'Other' as [Other] 
From tblUser t 

編輯:雖然記住,如果日期將被存儲爲字符串MIN/MAX將在弦上,而不是日期的工作。如果它們存儲爲字符串,則可能需要轉換爲Date

+0

這看起來不錯。這個問題是我得到重複條目,儘管事實上我選擇了不同的 – Wolves

+2

@Wolves你無法用disctinct得到「確切的重複」。你的問題可能來自你的其他加入數據,不是嗎? –

+0

拉斐爾,你是對的......重複的問題是由另一列稍有不同造成的。我已經刪除它了,這個解決方案似乎按照預期工作到目前爲止... – Wolves

0

嘗試使用其中NOT EXISTS子句,例如可能不正是你想要的,但顯示它可以幫助你

SELECT M.user, M.Eff_Date, M.End_Date, M.otherstuff 
FROM tbluser M 
WHERE NOT EXISTS(
    SELECT * FROM tbluser N 
    WHERE M.user=N.user AND (N.Eff_Date > M.Eff_Date OR N.Eff_Date = M.Eff_Date AND N.End_Date > M.End_Date) 
) 
+0

謝謝,我試過了,它看起來像是要工作。我需要在SQL輸出和我所知道的正確之間運行一個精確的比較,但WHERE NOT EXISTS似乎正是我正在尋找的。非常感謝你! – Wolves

+0

但要小心,我的示例可能有一些問題,它只導出結果eff_date和eff_date是最大的。 –

+0

如果您想首先獲取eff_data和enddat的第二個最大值,那麼您應該採用WHERE M.user = N.user AND(N.Eff_Date> M.Eff_Date或N.Eff_Date = M.Eff_Date AND N.End_Date> M.End_Date)'在子查詢中設置優先級,這樣對於單個用戶來說,它總是導出一行。 –

0

條款這應該工作:

SELECT M.user, M.mineffdate, M.maxenddate, M.otherstuff, a.otherstuff 
FROM (SELECT USER, MAX(m.end_date) as maxenddate, 
        MIN(m.eff_date) as mineffdate, 
        MIN(otherstuff) AS minotherstuff 
     from tbluser 
     group by user) M 
LEFT JOIN otherstuff A ON A.[user]=M.[user] 
+0

您的子查詢似乎沒有從條款。 –

+0

對不起,複製粘貼問題:) – Jayvee

0

這是我的快速解決問題

WITH MinTable As(
SELECT [User],MIN(Eff_Date) Eff_Date FROM Test GROUP BY [User]), 
MaxTable As(
SELECT [User],Max(End_Date) End_Date FROM Test GROUP BY [User]) 
SELECT MinTable.[User], MinTable.Eff_Date, MaxTable.End_Date FROM MinTable INNER JOIN MaxTable ON MinTable.[User] = MaxTable.[User] 

試試這個。

相關問題