【问题标题】:Get Distinct results of all columns based on MAX DATE of one根据 MA​​X DATE 获取所有列的不同结果
【发布时间】:2015-12-24 21:46:07
【问题描述】:

使用 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 来验证结果,但是一旦我让它工作就不需要它了。 I 结果集如下所示。

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

【问题讨论】:

    标签: sql sql-server max


    【解决方案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
    

    【讨论】:

    • 您的查询产生以下错误 Msg 4104, Level 16, State 1, Line 18 无法绑定多部分标识符“t1.Symbol”。消息 4104,级别 16,状态 1,第 18 行 无法绑定多部分标识符“t1.Type”。消息 4104,级别 16,状态 1,第 18 行 无法绑定多部分标识符“t1.Maxed”。消息 4104,级别 16,状态 1,第 18 行无法绑定多部分标识符“t1.Maxed”。
    • 抱歉,请参阅编辑,请参阅 FROM #tmpT AS t1,是的,我错过了。
    【解决方案2】:

    您应该使用派生表,因为您真的只想对 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;
    

    【讨论】:

    • 你怎么知道 FactPrices 中有一个 [Date] 字段(别名 p),你也加入了这个新字段?加入仅在 DateTimeKey 上。
    • 是的,我的坏 @Uporabnik003 不知道我是如何/为什么把它放在那里的!
    【解决方案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;
    

    【讨论】:

    • 这个查询达到了预期的结果。需要一个小的编辑,我将 Order BY s.symbol 更改为 ts.symbol。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多