保留 MIN / MAX 查询中的所有列,但 return 1 个结果
Keep all columns in MIN / MAX query, but return 1 result
我确定我以前做过这个,但似乎忘记了如何..
我正在尝试过滤一个记录集,以便我只得到 1 条记录,例如,如果这是我的 table 调用 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 |
我想对其进行过滤,以便获得用户为 "Matt" 且类型为 "Opened".
的日期 MIN
结果集需要包括 ID 字段和 return 仅 1 条记录,因此它看起来像这样:
| ID | User | Type | Date |
------------------------------------
| 1 | Matt | Opened | 1/8/2014 |
我在选择 ID 字段时难以通过 GROUPBY 要求...这似乎忽略了日期的最小值和 return 多于 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
日期,然后将结果加入主 table
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
我确定我以前做过这个,但似乎忘记了如何..
我正在尝试过滤一个记录集,以便我只得到 1 条记录,例如,如果这是我的 table 调用 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 |
我想对其进行过滤,以便获得用户为 "Matt" 且类型为 "Opened".
的日期MIN
结果集需要包括 ID 字段和 return 仅 1 条记录,因此它看起来像这样:
| ID | User | Type | Date |
------------------------------------
| 1 | Matt | Opened | 1/8/2014 |
我在选择 ID 字段时难以通过 GROUPBY 要求...这似乎忽略了日期的最小值和 return 多于 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
日期,然后将结果加入主 table
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