SQL Unique Distinct Column 1而不是其他列

时间:2015-02-13 15:35:55

标签: sql sql-server-2008 unique distinct

我试图运行一个连接2个表的sql语句,并在ID列上执行不同的操作并运行where子句将数据过滤到一天中的一小时。结果将显示我一天中的一小时,但会删除重复项,以便它给我独特的记录,我看到一些帖子有些有用,有些令人困惑。这是我到目前为止所做的。

  select DISTINCT FinalID,finaltime,finalos
    from dbo.FinalList
    join dbo.Users on dbo.FinalList.FinalID = dbo.Users.usersid 
   WHERE FinalDate >='2014-07-01'
     and finaldate <='2014-07-01'
     and finaltime >='00:00:00'
     and FinalTime <= '00:59:59'
order by FinalDate asc, FinalTime asc 

如果我拿走finaltime,finalos并选择DISTINCT FinalID,我会得到正确的数字。但是我希望看到来自Finaltime和Finalos的信息,但是只要我添加这些信息,它就会尝试在这些列上做一个截然不同的事情,我会得到狡猾的结果。我做子查询吗? ?

3 个答案:

答案 0 :(得分:1)

嗯,你必须决定你想要的值。

也许使用group by会提供您想要的内容:

select FinalID, min(finaltime), max(finaltime),
       min(finalos), max(finalos)
from dbo.FinalList join
     dbo.Users
     on dbo.FinalList.FinalID = dbo.Users.usersid 
where FinalDate >='2014-07-01' and
      finaldate <='2014-07-01' and
      finaltime >='00:00:00' and
      FinalTime <= '00:59:59'
group by FinalId;

答案 1 :(得分:0)

Distinct(https://technet.microsoft.com/en-us/library/ms187831%28v=sql.105%29.aspx)语句将返回唯一的行。这就是说,在您选择的列中是唯一的。因此,如果其中一个Col / Row与另一个不同,那么它也将作为结果输出。您应该使用MAX或Min然后分组。

答案 2 :(得分:0)

您不会说出如何在具有相同ID但finaltimefinalos的值不同的各种记录中做出决定。

我将假设您的最后时间是您最近的时间(最大的时间),并且您希望finalos值与最后时间一致。

;
WITH A as 
(
   select FinalID
       ,  Finaltime
       ,  Finalos
   from dbo.FinalList
     join dbo.Users 
        on dbo.FinalList.FinalID = dbo.Users.usersid 
   WHERE FinalDate >='2014-07-01'
     and finaldate <='2014-07-01'
     and finaltime >='00:00:00'
     and FinalTime <= '00:59:59'
 )
 ,  B as  
 (
     SELECT  A.FinalID
         ,   A.Finaltime
         ,   A.FinalOS
         ,   RowNumber = ROW_NUMBER() OVER (
                           PARTITION BY A.FinalID
                           ORDER BY FinalTime DESC
                         )
     FROM    A
 )
 SELECT  FinalID
    ,    FinalTime
    ,    FinalOS
 FROM    B
 WHERE   B.RowNumber = 1
 ORDER BY
        FinalTime
    ,   FinalOS

ETA:修正了语法。