我确信我之前已经这样做了,但似乎已经忘记了......
我正在尝试过滤一个记录集,以便我只获得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
日期,其中用户是“马特”而类型是“已打开”。
结果集需要包含ID字段并仅返回1条记录,因此它看起来像这样:
| ID | User | Type | Date |
------------------------------------
| 1 | Matt | Opened | 1/8/2014 |
在选择ID字段时,我很难超越GROUPBY要求......这似乎忽略了日期的MIN并返回了超过1条记录。
答案 0 :(得分:3)
使用TOP
和ORDER BY
:
select top 1 *
from table
where user = "Matt" and type = "Opened"
order by date asc;
修改:从desc
到asc
更改了顺序,因为这可以实现我所追求的MIN
效果。
答案 1 :(得分:1)
另一种方法是找到每min
和max
的{{1}}或user
日期,然后将结果重新加入主表
type
答案 2 :(得分: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