2015-09-27 80 views
1

MAX日,所有列的顯着成果使用SQL Server 2012獲取基礎上的一個

我已經看到了關於該主題的幾個線程,但我不能找到一個涉及查詢多個連接。我無法在此數據庫上創建VIEW,因此需要連接。

查詢

SELECT 

     p.Price 
     ,s.Type 
     ,s.Symbol 
     , MAX(d.Date) Maxed 
    FROM AdventDW.dbo.FactPrices p 
    INNER JOIN dbo.DimSecurityMaster s 
    ON s.SecurityID = p.SecurityID 
    INNER JOIN dbo.DimDateTime d 
    ON 
    p.DateTimeKey = d.DateTimeKey 
    GROUP BY p.Price , 
      s.Type , 
      s.Symbol 
ORDER BY s.Symbol 

查詢工作,但並沒有產生明顯的效果。我正在使用Order by來驗證結果,但是一旦我開始工作,就不需要它了。我結果集看起來像這樣。

Price Type Symbol Maxed 
10.57 bfus *bbkd   3/31/1989 
10.77 bfus *bbkd   2/28/1990 
100.74049 cbus 001397AA6  8/2/2005 
100.8161 cbus 001397AA6  7/21/2005 

的結果集我要的是

Price Type Symbol Maxed 
10.77 bfus *bbkd   2/28/1990 
100.74049 cbus 001397AA6  8/2/2005 

這裏是一些其他StackOverflow的線程我試過,但不能用我特定的查詢得到牛逼工作

How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

SQL Selecting distinct rows from multiple columns based on max value in one column

回答

3

如果您想要數據爲格言嗯日期,使用row_number()而不是group by

SELECT ts.* 
FROM (SELECT p.Price, s.Type, s.Symbol, d.Date, 
      ROW_NUMBER() OVER (PARTITION BY s.Type, s.Symbol 
           ORDER BY d.Date DESC 
           ) as seqnum 
     FROM AdventDW.dbo.FactPrices p INNER JOIN 
      dbo.DimSecurityMaster s 
      ON s.SecurityID = p.SecurityID INNER JOIN 
      dbo.DimDateTime d 
      ON p.DateTimeKey = d.DateTimeKey 
    ) ts 
WHERE seqnum = 1 
ORDER BY s.Symbol; 
+0

此查詢達到期望的結果。在我將Order BY s.symbol更改爲ts.symbol時需要一個小編輯。謝謝。 –

1

您應該使用派生表,因爲你真的只想組DateTimeKey表來獲得MAX日期。

SELECT p.Price , 
     s.Type , 
     s.Symbol , 
     tmp.MaxDate 
FROM AdventDW.dbo.FactPrices p 
INNER JOIN dbo.DimSecurityMaster s ON s.SecurityID = p.SecurityID 
INNER JOIN 
    (SELECT MAX(d.Date) AS MaxDate , 
      d.DateTimeKey 
    FROM dbo.DimDateTime d 
    GROUP BY d.DateTimeKey) tmp ON p.DateTimeKey = tmp.DateTimeKey 
ORDER BY s.Symbol; 
+1

您如何知道FactPrices(別名p)中的[Date]字段,您是否也加入這個新字段?該連接僅在DateTimeKey上。 – Iztoksson

+0

是的,我的壞@ Uporabnik003不知道如何/爲什麼我把它放在那裏! – Stenerson

+0

該查詢有效,但仍會產生重複項。 –

1
/* 
    this is your initial select which is fine because this is base from your original criteria, 
I cannot ignore this so i'll keep this in-tact. Instead from here i'll create a temp 
    */ 

    SELECT 
     p.Price 
     , s.Type 
     , s.Symbol 
     , MAX(d.Date) Maxed 
    INTO #tmpT 
    FROM AdventDW.dbo.FactPrices p 
    INNER JOIN dbo.DimSecurityMaster s 
     ON s.SecurityID = p.SecurityID 
    INNER JOIN dbo.DimDateTime d 
     ON p.DateTimeKey = d.DateTimeKey 
    GROUP BY p.Price , 
     s.Type , 
     s.Symbol 
    ORDER BY s.Symbol 

SELECT innerTable.Price, innerTable.Symbol, innerTable.Type, innerTable.Maxed 
FROM (

    SELECT 
     ROW_NUMBER() OVER (PARTITION BY t1.Symbol, t1.Type, t1.Maxed ORDER BY t1.Maxed DESC) as row 
     , * 
    FROM #tmpT AS t1 
) AS innerTable 
WHERE row = 1 

DROP TABLE #tmpT 
+0

您的查詢會產生以下錯誤消息4104,級別16,狀態1,行18 無法綁定多部分標識符「t1.Symbol」。 消息4104,級別16,狀態1,行18 無法綁定多部分標識符「t1.Type」。 消息4104,級別16,狀態1,行18 無法綁定多部分標識符「t1.Maxed」。 消息4104,級別16,狀態1,行18 無法綁定多部分標識符「t1.Maxed」。 –

+0

我的歉意,請參閱編輯,看到從#tmpT AS t1,是的,我錯過了這一點。 –