这是一个SQL效率问题.
不久前,我不得不编写一系列查询来从ERP系统中提取数据.其中大部分都很简单,但其中一个导致了一个相当低效的查询,并且一直困扰着我,因为必须有更好的方法.
问题并不复杂.您有一系列销售数据.在每一行中,您都有数量,销售价格和销售员代码以及其他信息.
佣金是基于阶梯式滑动比例支付的.他们卖的越多,佣金越多.步数可能是1000,10000,10000 $等等.现实世界的问题更复杂,但就其本质而言.
我发现这样做的唯一方法是做这样的事情(显然不是真正的查询)
select qty, price, salesman,
(select top 1 percentage from comissions
where comisiones.salesman = saleslines.salesman
and saleslines.qty > comisiones.qty
order by comissiones.qty desc
) percentage
from saleslines
Run Code Online (Sandbox Code Playgroud)
这导致了正确的佣金,但是非常沉重.
有没有更好的方法呢?我不是在找人重写我的sql,更多的是"看看foobar查询",我可以从那里拿走它.
可以为不同的销售人员,物品和客户甚至销售日期指定现实生活佣金结构.它也会不时变化,所以一切都必须由表中的数据驱动...即我不能在sql中放置固定范围.当前查询返回大约3-400000行,大约需要20-30秒.幸运的是它只用了一个月,但缓慢有点烦我.
这是在mssql上.
伊恩
编辑:
我应该从一开始就给出一个更复杂的例子.我现在意识到,我最初的例子是遗漏了复杂性的一些基本要素,向所有人道歉.
这可能更好地捕获它
select client-code, product, product-family, qty, price, discount, salesman,
(select top 1 percentage from comissions
where comisiones.salesman = saleslines.salesman
and saleslines.qty > comisiones.qty
and [
a collection of conditions which may or may not apply:
Exclude rows if the salesman has …Run Code Online (Sandbox Code Playgroud) 假设您正在做这样的事情:
$partitions = get-wmiobject -query "Associators of {Win32_DiskDrive.DeviceID=""$DevID""} WHERE AssocClass = Win32_DiskDriveToDiskPartition" -computer $ComputerName
Run Code Online (Sandbox Code Playgroud)
如果你想获得每个磁盘的磁盘标题('C:'),你需要这样的东西:
function GetDiskCaption {
param ($Partition, $ComputerName)
$DeviceID = $Partition.DeviceID
$colLogicalDisk = get-wmiobject -query "Associators of {Win32_DiskPartition.DeviceID=""$DeviceID""} WHERE AssocClass = Win32_LogicalDiskToPartition" -computer $ComputerName
If ($colLogicalDisk.Caption -ne $null) {
return $colLogicalDisk.Caption
}
Else {
return "UNASSIGNED"
}
}
Run Code Online (Sandbox Code Playgroud)
我不是一个非常高级的PowerShell用户,所以问题是:什么是将磁盘标题添加到阵列的最佳PowerShell方式,以便可以将其输入到ft或其他脚本中?
现在我意识到我可以只执行一个foreach循环来打印出来,但是我想弄清楚如何使用额外的列扩展数组,以便我可以使用管道运算符来格式化数组.
Microsoft网站上关于数组处理的示例都基于一维数组,因此添加数组似乎不是答案.
我特意尝试编写一个脚本来转储磁盘列表,以及它们的iSCSI映射(如果有的话)以及该磁盘上的各个分区.
我正在尝试在系统上获得主监视器的分辨率.所以
get-wmiobject -class win32_videocontroller
Run Code Online (Sandbox Code Playgroud)
将返回包含分辨率的单个对象或对象列表(术语可能不正确).如果要拉出单个值,例如.currenthorizontalresolution,则必须指定
(get-wmiobject -class win32_videocontroller).currenthorizontalresolution
Run Code Online (Sandbox Code Playgroud)
要么
(get-wmiobject -class win32_videocontroller)[0].currenthorizontalresolution
Run Code Online (Sandbox Code Playgroud)
取决于您的系统是否具有单个监视器,第一个工作的位置,或多个监视器,其中第二个工作.
我想使用单个表达式...但无法正确使用语法.我已经尝试了很多变化,但我无法弄清楚使用单行来获得第一个(或唯一)监视器的分辨率的语法.
要明确这是一个powershell语法问题,而不是wmi问题.
EBGreen建议
(,(get-wmiobject -class win32_videocontroller))[0].currenthorizontalresolution
Run Code Online (Sandbox Code Playgroud)
但这会回来
1366
Run Code Online (Sandbox Code Playgroud)
在具有单个监视器的系统上
1280
1920
Run Code Online (Sandbox Code Playgroud)
在有两个显示器的系统上.方向是正确的,我尝试了类似的选择,但不是很正确.