Configurando quantidade de registros retornados no Relatório

Boa Tarde Caros,

Estou imprimindo um relatório de variáveis que estão no BD da empresa, estabeleci uma consulta por data por meio de 2 setpoints (data final) e (data inicial). Até ai tudo bem funciona. Só que no meu processo as bateladas rodam em intervalos de tempo de 10 a 12 horas e quando é retornados os dados no relatório e como os dados estão sendo escritos de 10 em 10 segundos no BD esse relatório impresso está tendo entre 500 e 650 paginas e isso tá sendo bastante complicado pra analisar esses indicadores. O que eu gostaria era de alguma forma mudar o intervalo de impressão para 5min em 5min sem mexer na estrutura de atualização do BD. Poderiam me dar uma ajuda?

Olá, entendo que você deseja, portanto, a média dos valores a cada 5 minutos. Se for esse o caso, segue um exemplo de consulta.

SELECT
    DATEADD(MINUTE, DATEDIFF(MINUTE, 0, E3TimeStamp) / 5 * 5, 0) [Timestamp],
    AVG(Value) [Media]
FROM
    MyTable
WHERE
    E3TimeStamp >= '2023-08-08 00:00:00'
    AND E3TimeStamp <= '2023-08-08 23:00:00'
GROUP BY
    DATEADD(MINUTE, DATEDIFF(MINUTE, 0, E3TimeStamp) / 5 * 5, 0)
ORDER BY
    [Timestamp]

:warning: Edite as colunas e a cláusula WHERE conforme a sua necessidade.

Muito bom! Só para titulo de informação se eu quisesse mostrar no relatorio somente um registro a cada 5min e não a média eu editaria ali no campo AVG? Muito Obg

Acredito que seria um pouco mais complexo que isso. Considerando que seu domínio pode partir em horários aleatórios e, eventualmente, pode ficar offline, criando algumas ‘lacunas’ de registros, entendo que o correto seja retornar o primeiro registro maior ou igual ao definido na cláusula WHERE e partir dele, o próximo que tenha diferença de Timestamp maior ou igual a 5 minutos até o último valor desejado:

WITH SortedTable AS (
    SELECT
        Value,
        E3Timestamp,
        ROW_NUMBER() OVER (ORDER BY E3Timestamp) AS RowNum
    FROM
        MyTable
)

SELECT
    t.Value,
    t.E3Timestamp
FROM
    SortedTable t
WHERE
    t.RowNum = 1
    AND t.E3Timestamp >= '2023-10-16 00:00:00'
    AND t.E3Timestamp <= '2023-10-16 23:59:59'

UNION ALL

SELECT
    t.Value,
    t.E3Timestamp
FROM
    SortedTable t
    INNER JOIN SortedTable prev ON t.RowNum = prev.RowNum + 1
WHERE
    DATEDIFF(MINUTE, prev.E3Timestamp, t.E3Timestamp) >= 5
    -- Edite aqui
    AND t.E3Timestamp >= '2023-10-16 00:00:00'
    AND t.E3Timestamp <= '2023-10-16 23:59:59'
ORDER BY
    t.E3Timestamp;