保留 MIN / MAX 查询中的所有列,但 return 1 个结果

Keep all columns in MIN / MAX query, but return 1 result

我确定我以前做过这个,但似乎忘记了如何..

我正在尝试过滤一个记录集,以便我只得到 1 条记录,例如,如果这是我的 table 调用 TableA:

|  ID  |  User |  Type  |   Date   |
------------------------------------
|  1   | Matt  | Opened | 1/8/2014 |
|  2   | Matt  | Opened | 2/8/2014 |
|  3   | Matt  | Created| 5/8/2014 |
|  4   | John  | Opened | 1/8/2014 |
|  5   | John  | Created| 2/8/2014 |

我想对其进行过滤,以便获得用户为 "Matt" 且类型为 "Opened".

的日期 MIN

结果集需要包括 ID 字段和 return 仅 1 条记录,因此它看起来像这样:

|  ID  |  User |  Type  |   Date   |
------------------------------------
|  1   | Matt  | Opened | 1/8/2014 |

我在选择 ID 字段时难以通过 GROUPBY 要求...这似乎忽略了日期的最小值和 return 多于 1 条记录。

使用TOPORDER BY:

select top 1 *
from table
where user = "Matt" and type = "Opened"
order by date asc;

编辑:将顺序从 desc 更改为 asc,因为这实现了我想要的 MIN 效果。

另一种方法是根据 usertype 找到 minmax 日期,然后将结果加入主 table

SELECT A.ID,
       A.USER,
       A.Type,
       A.Date
FROM   yourtable A
       INNER JOIN (SELECT USER,
                          Type,
                          Min(Date) Date
                   FROM   yourtable
                   WHERE  USER = "Matt"
                          AND type = "Opened"
                   GROUP  BY USER,
                             Type) B
               ON A.USER = B.USER
                  AND A.Type = B.Type
                  AND A.date = B.Date 

您可以尝试使用分区函数非常简单,它为每个用户提供结果并且性能更好

;WITH cte
AS (
    SELECT *
        ,ROW_NUMBER() OVER (
            PARTITION BY [USER]
            ,type ORDER BY DATE ASC
            ) rnk
    FROM tablea
    )
SELECT *
FROM cte
WHERE type = 'opened'
    AND rnk = 1