Sql 保留最小/最大查询中的所有列,但返回1个结果

Sql 保留最小/最大查询中的所有列,但返回1个结果,sql,ms-access,Sql,Ms Access,我肯定我以前做过,但好像忘了怎么做 我正在尝试筛选一个记录集,以便只获得1条记录,因此,例如,如果这是我的表,名为TableA: | ID | User | Type | Date | ------------------------------------ | 1 | Matt | Opened | 1/8/2014 | | 2 | Matt | Opened | 2/8/2014 | | 3 | Matt | Created| 5/8/2014 |

我肯定我以前做过,但好像忘了怎么做

我正在尝试筛选一个记录集,以便只获得1条记录,因此,例如,如果这是我的表,名为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 |
我想对其进行过滤,以便获得日期的
MIN
,其中用户为“Matt”,类型为“Opened”

结果集需要包含ID字段并仅返回1条记录,因此它看起来如下所示:

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

在选择ID字段时,我很难通过GROUPBY要求。。。这似乎忽略了日期的最小值并返回了多条记录。

使用
TOP
ORDER BY

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

编辑:将订单从
desc
更改为
asc
,因为这达到了我所追求的
MIN
效果。

使用
TOP
订单依据

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

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

另一种方法是找到
MIN
max
每个
用户的日期
类型
,然后将结果连接回主表

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 

另一种方法是查找每个
用户的
min
max
日期和
类型
,然后将结果连接回主表

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

您可以很容易地尝试使用分区函数,它为每个用户提供了结果,并且性能更好

;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

感谢这一点,因为它也能起作用。。我选择了Gordon's,因为它的代码少了一点。是的,显然这是更好的方法。。我只是想分享另一种方法来达到这个结果这就是为什么我们要用另一种方法来回答这个问题。。我选择了Gordon's,因为它的代码少了一点。是的,显然这是更好的方法。。我只是想分享另一种方法来获得结果。这就是为什么用另一种方法开始回答。我不能让这个工作,但感谢你的回答:)我不能让这个工作,但感谢你的回答:)order by应该是
asc
(升序)以在我认为的日期获得MIN的效果。order by应该是
asc
(升序)我想是为了得到MIN对日期的影响。