【问题标题】:SQL Server: how can I change this query to use subquery with date column?SQL Server:如何更改此查询以使用带有日期列的子查询?
【发布时间】:2017-05-24 17:58:17
【问题描述】:

我有一个大约 20 列的查询,为简洁起见,我显示的是 *

SELECT TOP 1
    *
FROM 
    [Frontier].[dbo].[tblLoadFile]
WHERE
    TN = 4132644856
ORDER BY 
    CallTime DESC

有人告诉我,我应该在 subquery 中的 calldate 上使用 max,因为它是编写查询的“更快”和“正确”的方式。

我将如何以及在何处放入max(calldate) 子查询?

这是用于 SQL Server / T-SQL

【问题讨论】:

  • 你到底想用这个查询做什么?返回最新的CallTime?返回与最近的CallTime关联的所有列?
  • 为了简洁,不要删除重要的细节。您特别询问是否在列上执行Max() 函数,但要删除SELECT 的整个列结构。显示完整的查询。
  • 听起来有人建议您将 Top 1 替换为 max(calldate)。但是,如果您使用 MAX,您还需要一个 GROUP BY,因为它是一个聚合函数(@ollie 以不同的方式提出相同的问题。基本上您需要 1 列还是 20 列,因为这会改变查询。
  • 您的意思是“使用 max(calldate) 而不是 TOP 1 order by callTime”吗?如果是这样,我认为这不是更快或更合适。
  • @JacobH 取决于表的索引方式。如果出现平局,也使用 MAX() 可能会导致多行。

标签: sql sql-server tsql subquery


【解决方案1】:

假设您不尝试更改当前查询的逻辑,则将 TOP 1/Order 替换为 MAX 子查询的方式如下:

SELECT *
FROM [Frontier].[dbo].[tblLoadFile]
where TN = 4132644856
AND CallTime = (SELECT MAX(CallTime) 
                FROM  [Frontier].[dbo].[tblLoadFile]
                where TN = 4132644856)

但是,正如我在 cmets 中提到的,如果存在平局,这可能会产生多行,并且不一定更快,具体取决于表的索引方式。

【讨论】:

  • 我从中得到 2 条记录,
  • 呃,有相同的CallTime 2017-01-17 14:05:57.000
  • 就像我说的。 :)
【解决方案2】:

或许你可以考虑不使用MAX,保证一排后退。

SELECT *
FROM (SELECT *
            , ROW_NUMBER() OVER (ORDER BY CallTime DESC) AS Rownum
        FROM [Frontier].[dbo].[tblLoadFile]
        WHERE TN = 4132644856
) a
WHERE a.Rownum = 1 

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2014-08-29
    相关资源
    最近更新 更多