2015-09-27 64 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,是的,我错过了这一点。 –