【问题标题】:Select distinct group of records according to one column then order them by datetime根据一列选择不同的记录组,然后按日期时间排序
【发布时间】:2016-06-16 15:18:21
【问题描述】:

我想根据一个列值选择不同的记录组,然后按日期时间对它们进行排序。

例如,我有这张数据表

+----+---------+-------+---------------------------+
| id | Name    | Index | DateTime                  |
+----+---------+-------+---------------------------+
|  3 | Index   | 1     | 2016-03-03 12:03:15.353   |
|  4 | Index   | 1     | 2016-03-01 12:03:15.353   |
|  5 | Middle  | 2     | 2016-03-03 12:03:15.353   |
|  6 | Little  | 3     | 2016-03-03 12:03:15.353   |
|  7 | Thumb   | 4     | 2016-03-03 12:03:15.353   |
|  8 | Thumb   | 4     | 2016-03-01 12:03:15.353   |
+----+---------+-----------------------------------+

我想得到这样的结果:

+----+---------+-------+---------------------------+
| id | Name    | Index | DateTime                  |
+----+---------+-------+---------------------------+
|  3 | Index   | 1     | 2016-03-03 12:03:15.353   |
|  5 | Middle  | 2     | 2016-03-03 12:03:15.353   |
|  6 | Little  | 3     | 2016-03-03 12:03:15.353   |
|  7 | Thumb   | 4     | 2016-03-03 12:03:15.353   |
+----+---------+-----------------------------------+

+----+---------+-------+---------------------------+
| id | Name    | Index | DateTime                  |
+----+---------+-------+---------------------------+    
|  4 | Index   | 1     | 2016-03-01 12:03:15.353   |    
|  8 | Thumb   | 4     | 2016-03-01 12:03:15.353   |
+----+---------+-----------------------------------+

考虑一个指纹系统,该系统保存所有指纹,并且在重新注册同一手指时不会覆盖,如果手指重新注册多次,我想检索最新注册的手指以及它们的历史记录。

我尝试了这个根据索引返回不同记录的查询:

SELECT a.*
FROM    Fingerprint a
INNER JOIN 
      (SELECT DISTINCT [Index], MIN(Id) as id
       FROM Fingerprint 
       GROUP BY [Index]) AS b
ON a.[Index] = b.[Index] 
    AND a.id = b.id

WHERE [RefNumber] = '00000'

ORDER BY [LastUpdatedOn] DESC

我怎样才能实现这个是 sql 查询?


我在这里发现了一个类似的问题: Get Distinct rows according to one column and order by date

使用 LINQ 检索没有历史记录的不同记录。

【问题讨论】:

    标签: sql sql-server tsql select


    【解决方案1】:

    逻辑:

    使用Partition 函数根据id 列计算排名,然后按排名排序,然后按id 列排序

    select [id], [Name], [Index], [DateTime] from
    (
     Select 
         *, 
        ROW_NUMBER() OVER (PARTITION by Name order by id asc) as rr
     from Fingerprint
     ) t
    order by rr asc, id asc
    

    输出截图:

    【讨论】:

    • 感谢@DhruvJoshi,它有效,我可以过滤结果以选择我可以检索到哪个级别,例如我只想检索最新的一组手指或返回两组等。跨度>
    • 是的,你可以。您可以在 `ORDER BY' 语句之前添加类似 WHERE rr =2 的 where 子句来检索所需的行。
    【解决方案2】:

    最简单的方法可能是使用窗口row_number() 函数:

    SELECT [id], [Name], [Index], [DateTime]
    FROM   (SELECT [id], [Name], [Index], [DateTime],
                   ROW_NUMBER() OVER (PARTITION BY [Name] ORDER BY [DateTime] AS rn
            FROM   Fingerprint) f
    WHERE   rn = 1
    

    【讨论】:

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