我有一个表来源于一个案例敏感的旧遗留系统,特别是一个状态列,其中's'='计划导入'和'S'='计划管理'.这个表最终进入了我可以查询的SQL Server 2000数据库.我的查询相对简单,只是计算...
Select trans_type, count(1) from mytable group by trans_type
Run Code Online (Sandbox Code Playgroud)
这是将'S'的计数与's'计数分组.有没有办法强制查询是封顶敏感的?我同时访问SQL Server 2000和2005和环境中运行这一点,但是在服务器(所以我不能设置服务器属性)......我想我可以将数据移动到我的本地和设置上的东西有限的管理能力我的本地我可以完全访问服务器选项,但更喜欢tsql解决方案.
创建两个临时表然后加载...这是架构.
Create table #SH ([date] datetime,
sched_id int,
agent_id int)
Create table #SD (sched_id int,
start_minute int,
length int,
exception_code int)
Run Code Online (Sandbox Code Playgroud)
(遗憾的是,架构和设计是我无法改变的,两个临时表都是从平面文件加载的.如果需要,我可以引入并加载新的临时表).
一点背景 - #SH标题表将人员计划保存为"Start_minute",并以分钟为单位进行"schedule_length".例如,如果开始分钟和时间表长度都是480,那将是上午8点(上午8点=第480分钟),直到下午4点(480分钟后,下午4点=第960分钟)
#SD表保存标头的例外.在上面的示例中,该人可能会有一个午餐例外,即start_minute = 720和30(12:00 - 12:30).
Date和agent_id是我唯一对#SH感兴趣的东西,#sd中的异常信息是我感兴趣的.
此查询有效:
Select [date],#sd.start_minute,#sd.length,#sd.start_minute + #sd.length as 'end_minute',agent_id
from #SH
inner join #SD on #SD.sched_id = #sh.sched_id
Run Code Online (Sandbox Code Playgroud)
*end_minute最终是start + length = end的计算值
这返回类似于:
Date Start length end
1 2010-11-11 600 30 630
2 2010-11-11 630 40 670
3 2010-11-11 750 15 765
4 2010-11-11 800 40 840
Run Code Online (Sandbox Code Playgroud)
现在我希望我能说这已经结束并走开......但存在数据输入问题.在第1行和第2行中,第1行的结束时间与第2行中的开始时间对齐,应该合并,因此我的结果如下所示:
Date Start …
Run Code Online (Sandbox Code Playgroud) 我遇到过使用1 = 1条件聚合而不是计数的编码
select sum(case when 1=1 then 1 else 0 end)
Run Code Online (Sandbox Code Playgroud)
在我看来,这相当于:
select count(1)
Run Code Online (Sandbox Code Playgroud)
起初我认为这是一个占位符,开发人员打算在这个条件聚合中重新访问一些额外的逻辑,但后来我在另一个脚本中找到它,然后是另一个脚本.这促使我四处询问,我发现之前的开发人员已经强调,这个总和条件在所有情况下都比计数函数更有效和更快(强调它足以让其他开发人员遵循以后的标准).对我来说似乎非常直观,迫使系统评估1 = 1条件可能很小,但它仍然是计数函数的额外工作.在我回来之前,我会在这里进行咨询.
a)这个开发人员说有条件聚合比计数更快是否有任何道理
完全是一个问题:b)有没有一个数据库系统可以比计数更快地评估条件聚合?
这是一个oracle 11g数据库,但我怀疑脚本是为oracle 8i编写的
作为奖励积分...我被要求优化此代码.将删除替换为计数函数会改善速度吗?记录数有时超过1亿.