我试图运行一个连接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的信息,但是只要我添加这些信息,它就会尝试在这些列上做一个截然不同的事情,我会得到狡猾的结果。我做子查询吗? ?
答案 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但finaltime
和finalos
的值不同的各种记录中做出决定。
我将假设您的最后时间是您最近的时间(最大的时间),并且您希望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:修正了语法。