请MIN/MAX查询中的所有列,但返回1结果

请MIN/MAX查询中的所有列,但返回1结果

问题描述:

我相信我这样做过,但似乎已经忘记了如何..请MIN/MAX查询中的所有列,但返回1结果

我试图筛选记录,这样我得到的只是1分的记录,因此,例如,如果这是我的表称为表A

| 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和类型是“已打开”。

结果集需要包括ID字段,只返回1分的记录,所以它看起来像这样:

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

我与得到过去GROUPBY要求选择ID字段时挣扎。 ..这似乎忽略MIN的日期并返回超过1条记录。

使用TOPORDER BY

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

编辑:从desc改变为asc,因为这实现了MIN影响我之后。

+0

感谢,通过标记为答案优雅:) – 2015-02-10 18:21:08

+0

顺序应该是'asc'(升序)获得MIN的约会我觉得效果。 – 2015-02-10 18:28:33

另一种方式是通过寻找每usertypeminmax日期再加入结果返回到主表

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 
+0

欣赏这一点,因为它的工作太..我去了戈登的,因为它是一个少一点的代码。 – 2015-02-10 18:21:57

+0

yeah显然这是更好的方式..只是想分享另一种方式来实现结果..这就是为什么用另一种方式开始答案.. – 2015-02-10 18:27:02

你可以尝试使用分区功能很容易的给出了每个用户和执行结果更好

;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 
+0

我无法得到这个工作,但感谢回答: ) – 2015-02-10 18:22:26