【问题标题】:Distinct one column in two tables MS SQL Server 2008两个表中的不同一列 MS SQL Server 2008
【发布时间】:2015-03-14 09:07:05
【问题描述】:

我想仅对 CustomerID 应用 distinct 并获取最新记录,因为我的 table1 中有 RecordUpdate_date 列。

我写了这个查询,但我缺少一些行(记录)并得到重复的记录。

请帮帮我。 谢谢

表1:

CustomerID, CustomerName, UpdateDate

表2:

CustomerID, DateofBirth

我的查询:

SELECT a.CustomerID
       ,a.CustomerName
       ,a.RecordUpDate_date
       ,b.DateofBirth
    FROM Table1 AS a
    INNER JOIN (
                 SELECT CustomerID
                       ,MAX(RecordUpdate_date) AS max_RecordUpdate_date
                    FROM Table1
                    GROUP BY CustomerID
               ) AS abc
        ON abc.CustomerID = a.CustomerID
           AND abc.max_RecordUpdate_date = a.RecordUpdate_date
    INNER JOIN Table2 AS b
        ON b.CustomerID =  a.CustomerID
    INNER JOIN (
                 SELECT CustomerID
                       ,MAX(DateofBirth) AS max_dob
                    FROM table2
                    GROUP BY CustomerID
               ) AS m
        ON m.CustomerID = a.Customer
           AND m.max_cus = c.DateofBirth

【问题讨论】:

  • 为上帝的爱格式化您的代码
  • 你想做什么?给出描述和一些示例记录。反正桌子好像不太正常!
  • 为什么这些表中的任何一个都会有不止一行的 CustomerID?
  • 更新客户名称应该更新同一行,而不是创建新行。
  • 它创建新的,因为它跟踪了更新的日期

标签: sql sql-server database sql-server-2008


【解决方案1】:

试试这个:

;WITH    CTE
      AS ( SELECT   CustomerID ,
                    MAX(UpdateDate) max_RecordUpdate_date
           FROM     dbo.Table1
           GROUP BY CustomerID
         ),
    CTE1
      AS ( SELECT   CustomerID ,
                    MAX(DateofBirth) max_dob
           FROM     dbo.Table2
           GROUP BY CustomerID
         )
SELECT  CTE.CustomerID ,
        CustomerName ,
        max_RecordUpdate_date ,
        max_dob ,
        FLOOR(( CAST (max_RecordUpdate_date AS INTEGER)
                - CAST(max_dob AS INTEGER) ) / 365.25) [Age]
FROM    CTE
        INNER JOIN Table1 ON Table1.CustomerID = CTE.CustomerID
                             AND Table1.UpdateDate = CTE.max_RecordUpdate_date
        LEFT JOIN CTE1 ON CTE1.CustomerID = CTE.CustomerID   

【讨论】:

  • 我不能使用这个,因为我的选择语句中有一些计算。选择 a.CustomerID ,a.CustomerName ,a.RecordUpDate_date ,b.DateofBirth, FLOOR((CAST (a.RecordUpdate_date AS INTEGER) - CAST(c.DATEOFBIRTH AS INTEGER)) / 365.25) AS Age ... 你能添加这个吗解决方案中的计算?
  • @SQL 为什么问题中没有该信息?是否还有其他对您的解决方案至关重要但您没有费心告诉任何人的事情?
  • 那是唯一的一个。很抱歉没有在问题中提及。我现在才收到那个请求。
  • 我已经添加了计算,但是你必须注意左连接的空值,如果有的话。
  • 非常感谢 Njnoorie,它有效。但我缺少记录,因为我查看了我的数据库,我应该得到比现在更多的结果。
【解决方案2】:

有很多方法可以只获取最新记录。我一直使用的个人是使用ROW_NUMBER()http://msdn.microsoft.com/en-us/library/ms186734.aspx

首先在 CTE 中,我们根据 customerid 和 desc 日期字段对行进行编号。接下来,您选择rn =1 获取每个客户的最新记录的位置。

;WITH   CTE
          AS (
               SELECT customerID
                   ,customerName
                   ,UpdateDate
                   ,ROW_NUMBER() OVER ( PARTITION BY customerID ORDER BY UpdateDate DESC ) AS rn
                FROM table1 AS a
             )
    SELECT a.customerID
           ,a.CustomerName
           ,a.UpdateDate
           ,b.DateOfBrith
        FROM CTE a
        JOIN table2 AS b
            ON a.customerId = b.CustomerID
        where a.rn = 1

【讨论】:

    【解决方案3】:
    SELECT a.CustomerId, a.CustomerName, a.UpdateDate, b.DateofBirth
    FROM Table1 a
    INNER JOIN (SELECT CustomerId, MAX(UpdateDate) as UDate
                FROM Table1
                GROUP BY CustomerId
                )  maxdate  ON a.CustomerId = maxdate.CustomerId
                            AND a.UpdateDate = maxdate.UDate
    INNER JOIN Table2 b ON a.CustomerId = b.CustomerId
    

    如果您有多个客户 ID 和更新日期记录,请使用 SELECT DISTINCT。

    【讨论】:

    • 出现此错误:在“内部”附近的预期条件的上下文中指定的非布尔类型表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多