SQL 独特的不同列 1 而不是其他列
SQL Unique Distinct Column 1 and not the other columns
我正在尝试 运行 连接 2 个表的 sql 语句,然后在 ID 列上执行不同操作,运行s 一个 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 并留下 select DISTINCT FinalID,我会得到正确的数字。但是我想查看来自 Finaltime 和 Finalos 的信息,但是一旦我添加这些信息,它就会尝试在这些列上进行区分,但我得到了不可靠的结果。我做子查询吗? ?
嗯,你必须决定你想要的值。
也许使用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;
Distinct(https://technet.microsoft.com/en-us/library/ms187831%28v=sql.105%29.aspx) 语句将 return 您的唯一行。也就是说,在您选择的列中是独一无二的。因此,如果其中一个 Col / Row 与另一个不同,那么它也会作为结果输出。您应该使用 MAX 或 Min,然后分组依据。
您没有说明如何在具有相同 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:固定语法。
我正在尝试 运行 连接 2 个表的 sql 语句,然后在 ID 列上执行不同操作,运行s 一个 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 并留下 select DISTINCT FinalID,我会得到正确的数字。但是我想查看来自 Finaltime 和 Finalos 的信息,但是一旦我添加这些信息,它就会尝试在这些列上进行区分,但我得到了不可靠的结果。我做子查询吗? ?
嗯,你必须决定你想要的值。
也许使用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;
Distinct(https://technet.microsoft.com/en-us/library/ms187831%28v=sql.105%29.aspx) 语句将 return 您的唯一行。也就是说,在您选择的列中是独一无二的。因此,如果其中一个 Col / Row 与另一个不同,那么它也会作为结果输出。您应该使用 MAX 或 Min,然后分组依据。
您没有说明如何在具有相同 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:固定语法。