【问题标题】:Ignore identical values in a specific column忽略特定列中的相同值
【发布时间】:2012-10-02 10:14:27
【问题描述】:

我有这个查询可以正常工作。但是,我遇到了在 [id2] 列下返回​​相同 int 值的查询的问题。我需要帮助来获取值的一个实例而忽略另一个。基本上抓住一个独特的[id2]。任何帮助将不胜感激。另外,如果您需要澄清,请告诉我。

SELECT [id],[id1]
 ,[id2]
 ,[name]
 ,[date]
 ,[user]     
FROM [MyDatabase.table]
Where [date]>= dateadd(day,datediff(day,0,getdate()),-5)
ORDER BY [cid]

编辑 1:

id1       id2    name        time                user
6466    171477  item1 2012-10-10 07:08:48.000   user1
6469    171477  item1 2012-10-10 07:11:01.000   user1
6468    171477  item1 2012-10-10 07:10:37.000   user1
6465    171477  item1 2012-10-10 07:07:43.000   user1
6464    171477  item1 2012-10-10 07:06:58.000   user1
6467    171477  item1 2012-10-10 07:09:35.000   user1
6474    173026  item2 2012-10-10 10:20:21.000   user2
6478    173297  item3 2012-10-10 11:31:55.000   user3
6472    175445  item4 2012-10-10 07:18:17.000   user1
6460    175977  item5 2012-10-08 07:42:39.000   user4
6473    176253  item6 2012-10-10 10:18:21.000   user2
6471    176253  item6 2012-10-10 10:15:03.000   user2
6470    176253  item6 2012-10-10 10:14:34.000   user2

应该是:

id1     id2    name        time                user
6466    171477  item1 2012-10-10 07:08:48.000   user1
6474    173026  item2 2012-10-10 10:20:21.000   user2
6478    173297  item3 2012-10-10 11:31:55.000   user3
6472    175445  item4 2012-10-10 07:18:17.000   user1
6460    175977  item5 2012-10-08 07:42:39.000   user4
6473    176253  item6 2012-10-10 10:18:21.000   user2

【问题讨论】:

  • 如果您在该列中有重复项,那么其他列呢?请发布您的表格示例,以及输出应该是什么样子的示例
  • 什么逻辑决定忽略哪些时间以及包含哪些时间?您的示例使您的 time 和 id1 字段看起来是完全任意的。以 id2 171477 为例。您选择的时间不是 id2 的最早或最晚。您选择的 id1 既不是 id2 的最低值也不是最高值。
  • 好的,我只想让 id2 列只显示一个 171477 的实例。时间和 id1 对输出真的没有限制。
  • 那为什么不直接select distinct id2, name, user from ..... 呢?

标签: sql sql-server tsql sql-server-2012 distinct-values


【解决方案1】:
;WITH tbl_online AS (
SELECT [id],[r_id]
 ,[cid]
 ,[name]
 ,[date]
 ,[user] ,ROW_NUMBER () OVER (
PARTITION BY [cid] ORDER BY [cid] ) AS Rnum
FROM [MyDatabase.table]
Where [date]>= dateadd(day,datediff(day,0,getdate()),-5)   )
SELECT *  FROM tbl_online WHERE Rnum !>1
ORDER BY [cid]

【讨论】:

  • 谢谢!像魅力一样工作。
  • 当一个人可以使用标准和简单的Rnum = 1 时,为什么还要使用非标准、专有(SQL-Server)和令人困惑的Rnum !> 1,这超出了我的理解。
【解决方案2】:

您似乎正在寻找给定 (id2, name) 列表的最早记录,以下查询将检索它们:

SELECT a.*
FROM 
    YourTable a
    JOIN 
    (
        SELECT MIN(id1) as id1, id2, name FROM YourTable GROUP BY id2, name
    ) as b
    ON a.id1 = b.id1

【讨论】:

  • 乍一看是的...但是 id2 的另一个值是 6464,低于他选择的值??
  • 感谢@RThomas 的评论,另一个猜测是他正在根据 (id2, name) tuple 寻找最早的记录 :)
【解决方案3】:

您可能需要调整下面的ORDER BY 部分,具体取决于您要如何选择要返回的行。

WITH cteRowNum AS (
    SELECT id1, id2, name, time, user,
           ROW_NUMBER() OVER(PARTITION BY id2 ORDER BY time) AS RowNum
        FROM MyDatabase.Table
)
SELECT id1, id2, name, time, user
    FROM cteRowNum
    WHERE RowNum = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2017-12-14
    • 1970-01-01
    • 2019-12-05
    • 2011-02-24
    相关资源
    最近更新 更多