Je voudrais avoir votre aide afin de savoir s'il est possible d'get la requête désirée sans avoir besoin d'une procédure stockée. Je vais essayer de m'expliquer aussi bien que possible.
J'ai une structure similaire à celle-ci:
PK / FK / DateTime / Value 1 / 68 / 10:30 / 60.5 2 / 68 / 09:30 / 10.5 3 / 61 / 05:30 / 01.0 4 / 58 / 04:30 / 22.2 5 / 58 / 01:00 / 15.0
Ces lignes définissent un type d'événement décrit par la key étrangère (FK). Ce que je veux accomplir, c'est get les deux lignes les plus récentes pour un set d'events (FK).
Une sorte de
SELECT TOP 2 * FROM TABLE WHERE FK IN (68,58) ORDER BY DATETIME DESC
, mais en obtenant deux lignes de chaque FK dans la clause IN.
En langage naturel, l'opération souhaitée consiste à parcourir FK dans la clause IN et à faire une
SELECT TOP 2 * FROM TABLE ORDER BY DATETIME DESC.
Je voudrais savoir s'il est possible d'exprimer cela dans un SQL.
Merci beaucoup,
Une option
SELECT B.* FROM (SELECT DISTINCT FK FROM MyTable) A CROSS APPLY ( SELECT TOP 2 * FROM TABLE T WHERE T.FK = A.FK ORDER BY DATETIME DESC ) B
Ou
;WITH CTE AS ( SELECT * ROW_NUMBER() OVER (PARTITION BY FK ORDER BY DATETIME DESC) AS RowNum FROM Table ) SELECT * FROM CTE WHERE RowNum <= 2
SELECT d.* FROM( SELECT DISTINCT FK FROM YourTable ) AS y OUTER APPLY( SELECT TOP 2 * FROM YourTable AS y1 WHERE y1.FK = y.FK ORDER BY DATETIME DESC ) AS d
SELECT D.* FROM ( SELECT t.* , ROW_NUMBER = ROW_NUMBER() OVER ( PARTITION BY FK ORDER BY DateTime DESC ) FROM Table AS t ) AS D WHERE D.ROW_NUMBER <= 2
Ou user RowNumber
Vous pouvez toujours utiliser une union:
SELECT TOP 2 * FROM TABLE WHERE FK = 68 ORDER BY DATETIME DESC UNION SELECT TOP 2 * FROM TABLE WHERE FK = 58 ORDER BY DATETIME DESC