SQL返回每个ID的第一个结果

时间:2017-08-09 15:04:03

标签: sql sql-server

我的查询

Select ID, Date, Type, TypeID, Active from TableName

结果

ID      | Date                    | Type   | TypeID | Active 
------  | ----------------------- | ------ | ------ | ------
16026690| 2017-08-02 20:35:51.000 | Banana | 121    | 0
------  | ----------------------- | ------ | ------ | ------
16026695| 2017-08-02 20:43:03.000 | Banana | 121    | 0
------  | ----------------------- | ------ | ------ | ------
16026700| 2017-08-02 20:35:51.000 | Orange | 125    | 0
------  | ----------------------- | ------ | ------ | ------
16026705| 2017-08-02 20:43:03.000 | Orange | 125    | 0
------  | ----------------------- | ------ | ------ | ------
16026706| 2017-08-02 20:47:51.000 | Orange | 128    | 0
------  | ----------------------- | ------ | ------ | ------
16026706| 2017-08-02 20:50:51.000 | Orange | 128    | 0
------  | ----------------------- | ------ | ------ | ------
16026777| 2017-08-02 20:58:03.000 | Orange | 128    | 0

我想返回每个Type / TypeID的最新记录

所以我想在上表中看到的结果是:

ID      | Date                    | Type   | TypeID | Active 
------  | ----------------------- | ------ | ------ | ------
16026695| 2017-08-02 20:43:03.000 | Banana | 121    | 0
------  | ----------------------- | ------ | ------ | ------
16026705| 2017-08-02 20:43:03.000 | Orange | 125    | 0
------  | ----------------------- | ------ | ------ | ------
16026777| 2017-08-02 20:58:03.000 | Orange | 128    | 0

有人能指出我正确的方向来实现这一目标吗? 我正在使用MS SQL 2016

3 个答案:

答案 0 :(得分:4)

如PawelCz评论中所述,该链接向您显示可以使用以下内容完成:

;WITH temp AS (
    SELECT 
        *, 
        ROW_NUMBER() OVER( PARTITION BY [TypeID] ORDER BY [Date] DESC) AS rownum 
    FROM TableName 
)

SELECT
    *
FROM
    temp
WHERE 
    rownum = 1

答案 1 :(得分:2)

您可以查询如下:

Select top (1) with ties * from yourtable
   Order by Row_Number() over(Partition by [TypeId] order by [Date] desc)

答案 2 :(得分:0)

TOP 1

如果您正在使用MySql,这应该可以正常工作,如果您使用SQL Server,我建议LIMIT 1或'ROW_NUMBERS'而不是{{1}}