【问题标题】:How can I pass a condition to a MIN statement in TSQL如何将条件传递给 SQL 中的 MINI 语句
【发布时间】:2013-06-10 00:26:19
【问题描述】:

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

email, id, date 

email+id 上有一个唯一键,因此该表可以包含多个电子邮件地址。 id 可以为空。

我想以格式返回结果

email, first date, number of ids, first id date (if number of ids not null) 

dave@myfirm.con, 2013-06-11, 0, NULL
alan@myfirm.con, 2013-06-12, 2, 2013-06-13

我的查询非常接近我想要的,同时仍然很高效。

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])

但是,此版本的查询返回每封电子邮件的总体 MIN(date),如果它们有任何非空 id 的条目

如果没有 id,有什么方法可以使 MIN(date) 无效?我正在研究一个解决方案,如果 id 为 0 并获得这个的最小值,则将大量天数添加到 date,但似乎必须有更聪明的方法?

【问题讨论】:

    标签: sql sql-server tsql min


    【解决方案1】:

    试试这个

    SELECT TOP (@rows * @page) email, MIN([date]) as [date],COUNT(id) as [ids],
    [x] = (SELECT MIN([date]) FROM table t2 WHERE t2.email = t.email and t2.id IS NOT NULL) 
    FROM Table t
    GROUP BY email ORDER by MIN([date])
    

    【讨论】:

    • 当然——这是否是一个可衡量的性能影响完全取决于您的数据模型以及我们正在谈论的记录数量。 ;)
    【解决方案2】:

    你想要一个有条件的min(),所以在min()里面使用case

    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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2020-02-10
      • 1970-01-01
      • 2014-08-22
      • 2023-03-25
      • 2014-01-06
      相关资源
      最近更新 更多