Сложный SQL я не хочу конвертировать в хранимую процедуру - PullRequest
2 голосов
/ 15 октября 2010

Я хотел бы получить вашу помощь, чтобы узнать, возможно ли выполнить требуемый запрос без необходимости хранимой процедуры.Я постараюсь объяснить себя как можно лучше.

У меня похожая структура:

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

Эти строки определяют какое-то событие, которое описывается внешним ключом.(ФК).Чего я хочу добиться, так это получить две самые последние строки для набора событий (FK).

Какой-то

SELECT TOP 2 * 
FROM TABLE 
WHERE FK IN (68,58) 
ORDER BY DATETIME DESC

, но получая две строки каждого FK вПредложение IN.

На естественном языке желаемой операцией является итерация по FK в предложении IN и создание

SELECT TOP 2 * 
FROM TABLE 
ORDER BY DATETIME DESC.

. Я хотел бы знать, возможно ли выразить это в одномSQL.

Большое спасибо,

Ответы [ 4 ]

4 голосов
/ 15 октября 2010

Один вариант

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

Или

;WITH CTE AS
(
   SELECT *
      ROW_NUMBER() OVER (PARTITION BY FK ORDER BY DATETIME DESC) AS RowNum
   FROM
      Table
)
SELECT * FROM CTE WHERE RowNum <= 2
3 голосов
/ 15 октября 2010
    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
1 голос
/ 15 октября 2010
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

Или пользователь RowNumber

1 голос
/ 15 октября 2010

Вы всегда можете использовать союз:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...