我有一个表,其中包含与交易有关的所有信息,它具有进行销售的deviceID以及交易号(此表有数百万行)。我在临时表上有一些DeviceID的列表,并且正在联接事务表以获取最大事务数,但是要花很多时间才能显示结果。有没有更好的方法来编写sql语法以在更短的时间内获得结果?也许在同一个事务表中进行子查询以获取MAX值,任何想法将不胜感激。我当前的代码如下:
select a.DeviceID,
MAX(tq.Transaction_number)
from Datawarehouse.DBO.Transactions tq with (nolock)
/*The #Temp1 table contains the Device IDs we want to get the MAX transaction number ,
the total amount of Devices are between 1 and 1000 */
inner join #Temp1 a on a.DeviceID = tq.DeviceID
--We only want the MAX transaction number for sales ( Not Refunds)
where tq.Transaction_type = 'SALES'
答案 0 :(得分:1)
有时候效果更好:
select t.*,
(select max(tq.Transaction_number)
from Datawarehouse.DBO.Transactions tq
where t.DeviceID = tq.DeviceID and tq.Transaction_type = 'SALES'
)
from #temp1 t;
尤其是,您希望在Transactions(DeviceID, Transaction_type, Transaction_number desc)
上使用复合索引。
答案 1 :(得分:1)
我认为适当的索引编制会有所帮助。看看Example-Fiddle
查询:
Select
d.device_id,
MAX( t.transaction_id ) transaction_id
From
devices d
JOIN
transactions t
ON t.device_id = d.device_id
# AND transaction_types = ...
GROUP BY
d.device_id;
答案 2 :(得分:0)
您可以使用apply
:
select t.DeviceID, tt.Transaction_no
from #temp1 t cross apply (
select max(tr.Transaction_number) Transaction_no
from Datawarehouse.DBO.Transactions tr
where t.DeviceID = tr.DeviceID and
tr.Transaction_type = 'SALES'
) tt;
但是,如果您在({{1}
DeviceID
&Transaction_type
),并且不要在查询之前忘记Transaction_number
,尤其是在使用SSMS时。