我的数据库中有一个包含数千万行Payments
和Transactions
的表格。
Transactions
按Period
Periods
可以有多个Transaction
,一天内可以有多个Periods
。我的查询代码如下:
SELECT
lastTrx.[Num_TPA]
, lastTrx.periodo_max
, lastTrx.Transacao_max
, firstTrx.Transacao_min
, lastTrx.Data_Hora_Ficheiro_fim
, firstTrx.Data_Hora_Ficheiro_ini
, DATEDIFF(Minute, firstTrx.Data_Hora_Ficheiro_ini, lastTrx.Data_Hora_Ficheiro_fim) "minutos_periodo"
FROM
(
SELECT
[Num_TPA]
, SUBSTRING(REPLACE(STR([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 1, 3) AS [periodo_max]
, MAX(SUBSTRING(replace(str([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 4, 3)) [Transacao_max]
, MAX([Data_Hora_Ficheiro]) AS [Data_Hora_Ficheiro_fim]
FROM
[GPOS].[dbo].[Data_PRD_VALUES_CUBO_LIGHT]
GROUP BY
[Num_TPA]
, SUBSTRING(REPLACE(STR([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 1, 3)
) AS lastTrx
LEFT JOIN
(
SELECT
[Num_TPA]
, SUBSTRING(REPLACE(STR([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 1, 3) AS [periodo]
, MIN(SUBSTRING(REPLACE(STR([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 4, 3)) AS [Transacao_min]
, MIN([Data_Hora_Ficheiro]) AS [Data_Hora_Ficheiro_ini]
FROM
[GPOS].[dbo].[Data_PRD_VALUES_CUBO_LIGHT]
GROUP BY
[Num_TPA]
, SUBSTRING(REPLACE(STR([Num_Per_Trx_msg_Ult_Trn], 9), SPACE(1), '0'), 1, 3)
) AS firstTrx ON lastTrx.Num_TPA = firstTrx.Num_TPA
WHERE
lastTrx.periodo_max = firstTrx.periodo
AND lastTrx.Data_Hora_Ficheiro_fim != firstTrx.Data_Hora_Ficheiro_ini
ORDER BY
Num_TPA
, periodo
上面的查询需要40秒才能运行,这太长了。
当我将查询放入View时,由于超时而无法运行。
预期结果是每个终端都有一个每个时段的第一个和最后一个交易的统计数据以及每个时段之间的分钟数。
请帮我弄清楚如何: