Sto cercando di implementare una routine di paging un po 'diversa.T-SQL: Paging WITH TIES
Ai fini di un semplice esempio, supponiamo che ho un tavolo definita e popolata come segue:
DECLARE @Temp TABLE
(
ParentId INT,
[TimeStamp] DATETIME,
Value INT
);
INSERT INTO @Temp VALUES (1, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (1, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (1, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (2, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (2, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (2, '1/1/2013 02:00', 8);
INSERT INTO @Temp VALUES (3, '1/1/2013 00:00', 6);
INSERT INTO @Temp VALUES (3, '1/1/2013 01:00', 7);
INSERT INTO @Temp VALUES (3, '1/1/2013 02:00', 8);
TimeStamp
sarà sempre lo stesso intervallo, ad esempio dati giornalieri, dati 1 ora, dati 1 minuto, ecc. Non saranno mischiati.
Ai fini di reporting e di presentazione, voglio implementare il paging che:
- Ordini tramite
TimeStamp
- inizia con un suggerito
pageSize
(diciamo 4), ma regola automaticamente per includere ulteriori record corrispondenti aTimeStamp
. In altre parole, se 1/1/2013 01:00 è incluso per unoParentId
, lopageSize
suggerito verrà sovrascritto e tutti i record per l'ora 01:00 saranno inclusi per tuttiParentId's
. È quasi come l'opzioneTOP WITH TIES
.
Quindi eseguire questa query con pageSize
di 4 restituirebbe 6 record. Ci sono 3 ore 00:00 e 1 ora 01:00
per impostazione predefinita, ma poiché ci sono più ore 01:00's
, il pageSize
verrà sostituito per restituire tutte le ore 00:00
e 01:00
.
Ecco quello che ho finora, e penso di essere vicino come funziona per la prima iterazione, ma le query sequenziali per le prossime righe pageSize+
non funzionano.
WITH CTE AS
(
SELECT ParentId, [TimeStamp], Value,
RANK() OVER(ORDER BY [TimeStamp]) AS rnk,
ROW_NUMBER() OVER(ORDER BY [TimeStamp]) AS rownum
FROM @Temp
)
SELECT *
FROM CTE
WHERE (rownum BETWEEN 1 AND 4) OR (rnk BETWEEN 1 AND 4)
ORDER BY TimeStamp, ParentId
Il ROW_NUMBER garantisce il rispetto del pageSize minimo, ma il RANK includerà ulteriori vincoli.
quale versione di SQL Server? – gbn
Siamo spiacenti. Avrei dovuto dire che stavo usando 2008. –
dovresti usare una condizione su timestamp. Per la prima query 'timestamp> minValue' (a seconda del tipo di colonna datetime o datetime2). Dal risultato della query si legge un valore massimo per il timestamp. Per la seguente query si utilizza questo filtro massimo per filtrare: 'selezionare il primo 4 con i legami * da @temp dove timestamp> max' – tschmit007