请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条记录。
使用TOP
和ORDER BY
:
select top 1 *
from table
where user = "Matt" and type = "Opened"
order by date asc;
编辑:从desc
改变为asc
,因为这实现了MIN
影响我之后。
另一种方式是通过寻找每user
和type
的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
欣赏这一点,因为它的工作太..我去了戈登的,因为它是一个少一点的代码。 – 2015-02-10 18:21:57
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
我无法得到这个工作,但感谢回答: ) – 2015-02-10 18:22:26
感谢,通过标记为答案优雅:) – 2015-02-10 18:21:08
顺序应该是'asc'(升序)获得MIN的约会我觉得效果。 – 2015-02-10 18:28:33