如何在TSQL中将条件传递给MIN语句

ror*_*yok 1 sql t-sql sql-server min

我有一个包含以下各列的表格

email, id, date 
Run Code Online (Sandbox Code Playgroud)

email + id上有一个唯一键,因此表可以包含电子邮件地址的倍数。id可以为null。

我想以以下格式返回结果

email, first date, number of ids, first id date (if number of ids not null) 
Run Code Online (Sandbox Code Playgroud)

要么

dave@myfirm.con, 2013-06-11, 0, NULL
alan@myfirm.con, 2013-06-12, 2, 2013-06-13
Run Code Online (Sandbox Code Playgroud)

我的查询非常接近我想要的,但仍然很有效。

SELECT TOP (@rows * @page) email, MIN([date]) as [date],COUNT(id) as [ids],
[x] = CASE COUNT(id) WHEN 0 THEN NULL ELSE MIN([date]) END
FROM Table 
GROUP BY email ORDER by MIN([date])
Run Code Online (Sandbox Code Playgroud)

但是,此版本的查询将返回每封电子邮件的总MIN(日期),如果它们具有不为null的任何条目 id

如果没有ID,有什么方法可以使MIN(date)无效?我正在研究一种解决方案,date如果id为0 会增加很多天的时间,并获得MIN的最小值,但是似乎必须有一种更聪明的方法?

Gor*_*off 5

您需要有条件的min(),因此请case在内部使用min()

SELECT TOP (@rows * @page) email,
       MIN([date]) as [date],
       COUNT(id) as [ids],
       min(case when id is not null then [date] end) as [x]
FROM Table 
GROUP BY email
ORDER by MIN([date])
Run Code Online (Sandbox Code Playgroud)