SQL Select Лучшие практики - PullRequest
0 голосов
/ 30 июля 2009

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

USE tempdb
CREATE Table Tbl(
TblID Int,
AuditFieldID Int,
AuditValue Int,
AuditDate Date
)
GO
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009')


SELECT AuditFieldID,AuditValue,AuditDate
FROM Tbl A
WHERE TblID=
(SELECT TOP 1 TblID
FROM Tbl
WHERE AuditFieldID=A.AuditFieldID
ORDER BY AuditDate DESC
)

Ответы [ 4 ]

1 голос
/ 30 июля 2009

Агрегировать / ранжировать, чтобы получить ключ и самую последнюю дату, присоединиться, чтобы получить значение.

Предполагается, что SQL Server 2005 +

DECLARE @tbl Table (
TblID Int,
AuditFieldID Int,
AuditValue Int,
AuditDate Date
)

INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009')


;WITH cLatest AS
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY AuditFieldID ORDER BY AuditDate DESC) AS Ranking,
        AuditFieldID, AuditDate
    FROM
        @tbl
)
SELECT
    A.AuditFieldID, A.AuditValue, A.AuditDate
FROM
    @tbl A
    JOIN
    cLatest C ON A.AuditFieldID = C.AuditFieldID AND A.AuditDate = C.AuditDate
WHERE
    C.Ranking = 1
1 голос
/ 30 июля 2009

Существуют различные способы сделать это. Разные методы работают по-разному. Я призываю вас взглянуть на этот блог, в котором объясняются различные методы.

Включая значения, связанные с агрегированным столбцом

1 голос
/ 30 июля 2009

Simpler:

ВЫБЕРИТЕ топ 1 AuditFieldID, AuditValue, AuditDate ОТ ТБЛ заказ по AuditDate DES

0 голосов
/ 30 июля 2009

вам не нужен оператор where, так как вы уже выбираете из таблицы A и выбираете в том же поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...