【问题标题】:Unable to get distinct records in SQL with distinct command无法使用 distinct 命令获取 SQL 中的不同记录
【发布时间】:2016-01-05 16:33:09
【问题描述】:

我使用以下查询从表中获取不同的记录

 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 关键字适用于 select 语句中的所有列,而不仅仅是 distinct 之后的第一列。您能否更清楚地格式化结果并举例说明您正在寻找的结果?
  • 无法阅读。但是,distinct 适用于整个集合,而不仅仅是一列。
  • 如果它适用于整个集合,为什么 UFT 库伦不明显。我不确定我是否理解。我想要的结果是 UFT 库中的不同条目以及要省略的其他多个条目行。有没有简单的方法来做到这一点?
  • @RVRLibra 这是因为整行不是重复的。它查看每一列。如果查看结果中的第 6 行和第 7 行,并非所有列中的所有值都相同。看第 5 列,TIMESTAMPS,第 6 行和第 7 行的值不一样。那么在该示例中,您希望显示哪一行,6 还是 7?
  • 类似于this question,虽然我不太相信链接的问题足够笼统,可以被视为重复。由于我的单次投票就可以结束这个问题,我将把这个判断留给其他人。

标签: sql-server duplicates distinct


【解决方案1】:

正如已经为其他人解释的那样,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,我没有看到与您提供的输出匹配。不确定这是否重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    相关资源
    最近更新 更多