在运行 Sql 表最大日期逻辑时需要帮助

Posted

技术标签:

【中文标题】在运行 Sql 表最大日期逻辑时需要帮助【英文标题】:Need help in tunning Sql table max date logic 【发布时间】:2017-04-25 09:13:12 【问题描述】:

我们有一个如下所述的场景,需要输入以获得最佳逻辑。 数据库是sql server 2012。

我有一个表 abc,其中包含列 'a' 、 'b' 、 'c' 和日期字段 'd'。 如果表 abc 有 10 条不同日期的记录,这是最好的优化方式 有列 'a' , 'b' , 'c' 和 'd' 其中“d”只是整个记录集的最大日期。

例如如果下面是表abc数据,

a   b   c   d
a1  b1  c1  01-02-2017
a2  b2  c2  02-02-2017
a3  b3  c3  10-02-2017
a4  b4  c4  04-02-2017

what we need is,

a   b   c   d
a1  b1  c1  10-02-2017
a2  b2  c2  10-02-2017
a3  b3  c3  10-02-2017
a4  b4  c4  10-02-2017

这里我们需要复制所有记录的最大日期。

到目前为止我们尝试过的事情。

选项 1。Select a , b, c, (Select max(d) from abc) d from abc

选项 2。

Select a , b, c, max.max_D from abc
            join (Select max(d) max_D from abc) max on 1=1 

注意:这只是例如我们的实际需求是相同的,但是我们有超过 10 个连接,并且表中的数据非常庞大。

请提出建议。

【问题讨论】:

如果你不确定你给定的数据,我认为很难给你一个解决方案.. 【参考方案1】:

您的两个解决方案都访问表两次..由于您使用的是 2012,我建议使用 windows 函数来处理这个

Select a , b, c, 
max(d)over (order by d desc) as maxx
from abc

要使此查询以最佳方式执行,您需要以下索引

create index nci on table(d)
include(a,b,c)

【讨论】:

@TheGameiswar你能解释一下覆盖索引将如何执行 对于这个窗口函数,索引的格式应该是POC,这意味着分区和按列排序应该是关键列,其余应该包括【参考方案2】:

如果您希望优化插入,您可以在 SELECT 查询中简单地使用 MAX 函数。 如果您希望优化选择, 您可以使用计算列(这会降低 INSERT/UPDATE 性能)。

https://technet.microsoft.com/en-us/library/ms191250(v=sql.105).aspx

【讨论】:

【参考方案3】:
declare @MaxDate datetime

Select @MaxDate=max(d) from table1

select a,b,c @MaxDate d from table1

【讨论】:

虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of 如何解决这个问题。没有这个,你的回答就没有多少教育价值了——记住你是在为未来的读者回答这个问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。

以上是关于在运行 Sql 表最大日期逻辑时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

选择查询以连续查找最大日期

需要有关 SQL 中复杂 Join 语句的帮助

同一张表中的 SQL DATE 比较

SQL 查询优化

我需要一些关于 SQL Sum 函数按日期和组分组的帮助

SQL 问题 - 如何在 SQL Server 中使用迭代日期逻辑进行输出