2015-02-10 85 views
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條記錄。

回答

3

使用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

1

另一種方式是通過尋找每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

0

你可以嘗試使用分區功能很容易的給出了每個用戶和執行結果更好

;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