无法使用不同的命令在 SQL 中获取不同的记录
Unable to get distinct records in SQL with distinct command
我使用以下查询从 table
中获取不同的记录
SELECT distinct UFT
,ID
,NUM
,CONVERT(VARCHAR(19), UFT, 120) AS FTC
,CONVERT(VARCHAR(19), TIMESTAMP, 120) as TIMESTAMP
,CONVERT(VARCHAR(19), UIT, 120) AS UIT
,RANGE
,FORCE/1000/2 as FORCE
,CONVERT(VARCHAR(19), LFT, 120) as LFT
,CONVERT(VARCHAR(19), LIT, 120) as LIT
FROM TABLE1
where ID = 2
AND NUM = '144'
AND UFT > '2014-01-01 00:00:00.000'
and UFT <= '2015-01-01 00:00:00.000'
order by FTC, UIT desc
输出为
UFT ID NUM FTC TIMESTAMP UIT RANGE FORCE LFT LIT
2014-08-22 16:00:00.000 2 144 2014-08-22 16:00:00 2014-08-22 14:30:31 2014-08-22 11:40:54 5.00 0.792000000 2014-08-22 16:00:00 2014-08-22 12:40:54
2014-08-22 16:30:00.000 2 144 2014-08-22 16:30:00 2014-08-22 15:30:30 2014-08-22 12:40:48 5.00 0.836000000 2014-08-22 16:30:00 2014-08-22 13:40:48
2014-08-22 17:00:00.000 2 144 2014-08-22 17:00:00 2014-08-22 15:30:30 2014-08-22 12:40:48 5.10 0.880000000 2014-08-22 17:00:00 2014-08-22 13:40:48
2014-08-22 17:30:00.000 2 144 2014-08-22 17:30:00 2014-08-22 16:30:30 2014-08-22 13:40:24 5.20 0.932000000 2014-08-22 17:30:00 2014-08-22 14:40:24
2014-08-22 18:00:00.000 2 144 2014-08-22 18:00:00 2014-08-22 16:30:30 2014-08-22 13:40:24 5.30 0.984000000 2014-08-22 18:00:00 2014-08-22 14:40:24
2014-08-22 21:30:00.000 2 144 2014-08-22 21:30:00 2014-08-22 20:30:30 2014-08-22 17:40:52 6.40 1.656000000 2014-08-22 21:30:00 2014-08-22 18:40:52
2014-08-22 21:30:00.000 2 144 2014-08-22 21:30:00 2014-08-22 17:30:30 2014-08-22 17:07:40 6.60 1.860000000 2014-08-22 21:30:00 2014-08-22 18:07:40
2014-08-22 22:00:00.000 2 144 2014-08-22 22:00:00 2014-08-22 20:30:30 2014-08-22 17:40:52 6.40 1.704000000 2014-08-22 22:00:00 2014-08-22 18:40:52
2014-08-22 22:00:00.000 2 144 2014-08-22 22:00:00 2014-08-22 17:30:30 2014-08-22 17:07:40 6.70 1.904000000 2014-08-22 22:00:00 2014-08-22 18:07:40
2014-08-22 22:30:00.000 2 144 2014-08-22 22:30:00 2014-08-22 21:30:28 2014-08-22 18:40:49 6.50 1.764000000 2014-08-22 22:30:00 2014-08-22 19:40:49
尽管在 UFT 列上使用了 distinct,但我仍然在输出中找到多条记录。这可能是什么原因,有没有办法改进查询
正如已经为其他人解释的那样 distinct
对整行而不是单个列进行操作。
我添加了一个新列,可以让您消除排序中 UFT
值首次出现之后的行。我不得不猜测您想保留具有较早 timestamp
值的行,并且您还想在 FTC
上进行分区:在 row_number
表达式中适当更改。
with data as (
SELECT
UFT
,row_number() over (partition by FTC, UFT order by TIMESTAMP) as rn
,ID
,NUM
,CONVERT(VARCHAR(19), UFT, 120) AS FTC
,CONVERT(VARCHAR(19), TIMESTAMP, 120) as TIMESTAMP
,CONVERT(VARCHAR(19), UIT, 120) AS UIT
,RANGE
,FORCE/1000/2 as FORCE
,CONVERT(VARCHAR(19), LFT, 120) as LFT
,CONVERT(VARCHAR(19), LIT, 120) as LIT
FROM TABLE1
WHERE
ID = 2
AND NUM = '144'
AND UFT > '2014-01-01 00:00:00.000'
AND UFT <= '2015-01-01 00:00:00.000'
)
select * from data where rn = 1
ORDER BY
FTC, UIT DESC
您的查询显示 UIT
以降序排列,但我没有看到与您提供的输出匹配的结果。不确定这是否重要。
我使用以下查询从 table
中获取不同的记录 SELECT distinct UFT
,ID
,NUM
,CONVERT(VARCHAR(19), UFT, 120) AS FTC
,CONVERT(VARCHAR(19), TIMESTAMP, 120) as TIMESTAMP
,CONVERT(VARCHAR(19), UIT, 120) AS UIT
,RANGE
,FORCE/1000/2 as FORCE
,CONVERT(VARCHAR(19), LFT, 120) as LFT
,CONVERT(VARCHAR(19), LIT, 120) as LIT
FROM TABLE1
where ID = 2
AND NUM = '144'
AND UFT > '2014-01-01 00:00:00.000'
and UFT <= '2015-01-01 00:00:00.000'
order by FTC, UIT desc
输出为
UFT ID NUM FTC TIMESTAMP UIT RANGE FORCE LFT LIT
2014-08-22 16:00:00.000 2 144 2014-08-22 16:00:00 2014-08-22 14:30:31 2014-08-22 11:40:54 5.00 0.792000000 2014-08-22 16:00:00 2014-08-22 12:40:54
2014-08-22 16:30:00.000 2 144 2014-08-22 16:30:00 2014-08-22 15:30:30 2014-08-22 12:40:48 5.00 0.836000000 2014-08-22 16:30:00 2014-08-22 13:40:48
2014-08-22 17:00:00.000 2 144 2014-08-22 17:00:00 2014-08-22 15:30:30 2014-08-22 12:40:48 5.10 0.880000000 2014-08-22 17:00:00 2014-08-22 13:40:48
2014-08-22 17:30:00.000 2 144 2014-08-22 17:30:00 2014-08-22 16:30:30 2014-08-22 13:40:24 5.20 0.932000000 2014-08-22 17:30:00 2014-08-22 14:40:24
2014-08-22 18:00:00.000 2 144 2014-08-22 18:00:00 2014-08-22 16:30:30 2014-08-22 13:40:24 5.30 0.984000000 2014-08-22 18:00:00 2014-08-22 14:40:24
2014-08-22 21:30:00.000 2 144 2014-08-22 21:30:00 2014-08-22 20:30:30 2014-08-22 17:40:52 6.40 1.656000000 2014-08-22 21:30:00 2014-08-22 18:40:52
2014-08-22 21:30:00.000 2 144 2014-08-22 21:30:00 2014-08-22 17:30:30 2014-08-22 17:07:40 6.60 1.860000000 2014-08-22 21:30:00 2014-08-22 18:07:40
2014-08-22 22:00:00.000 2 144 2014-08-22 22:00:00 2014-08-22 20:30:30 2014-08-22 17:40:52 6.40 1.704000000 2014-08-22 22:00:00 2014-08-22 18:40:52
2014-08-22 22:00:00.000 2 144 2014-08-22 22:00:00 2014-08-22 17:30:30 2014-08-22 17:07:40 6.70 1.904000000 2014-08-22 22:00:00 2014-08-22 18:07:40
2014-08-22 22:30:00.000 2 144 2014-08-22 22:30:00 2014-08-22 21:30:28 2014-08-22 18:40:49 6.50 1.764000000 2014-08-22 22:30:00 2014-08-22 19:40:49
尽管在 UFT 列上使用了 distinct,但我仍然在输出中找到多条记录。这可能是什么原因,有没有办法改进查询
正如已经为其他人解释的那样 distinct
对整行而不是单个列进行操作。
我添加了一个新列,可以让您消除排序中 UFT
值首次出现之后的行。我不得不猜测您想保留具有较早 timestamp
值的行,并且您还想在 FTC
上进行分区:在 row_number
表达式中适当更改。
with data as (
SELECT
UFT
,row_number() over (partition by FTC, UFT order by TIMESTAMP) as rn
,ID
,NUM
,CONVERT(VARCHAR(19), UFT, 120) AS FTC
,CONVERT(VARCHAR(19), TIMESTAMP, 120) as TIMESTAMP
,CONVERT(VARCHAR(19), UIT, 120) AS UIT
,RANGE
,FORCE/1000/2 as FORCE
,CONVERT(VARCHAR(19), LFT, 120) as LFT
,CONVERT(VARCHAR(19), LIT, 120) as LIT
FROM TABLE1
WHERE
ID = 2
AND NUM = '144'
AND UFT > '2014-01-01 00:00:00.000'
AND UFT <= '2015-01-01 00:00:00.000'
)
select * from data where rn = 1
ORDER BY
FTC, UIT DESC
您的查询显示 UIT
以降序排列,但我没有看到与您提供的输出匹配的结果。不确定这是否重要。