SQL complexe je ne veux pas convertir dans une procédure stockée

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