1

T-SQL を使用すると、すべてのメンバー (recEntrants) をリストする 2 つのテーブルがあります。2 番目のテーブル (recEntrantStatus) には、各メンバーのステータス更新が含まれます。現在、すべてのメンバーのすべての更新を取得する次の SQL があります。

SELECT EN.Id, EN.artistName, GR.genre, ES.lastModifiedOn, EN.voteStatus, 
ES.notified
FROM recEntrantStatus AS ES
JOIN recEntrants AS EN
ON ES.entrantId = EN.Id
JOIN recGenre AS GR
ON EN.genreId = GR.Id
AND ES.judgeId = @judgeId
AND ES.roundId > 0
ORDER BY ES.voted DESC, ES.roundId, EN.Id

以下に追加された新しい要件:

SELECT EN.Id, EN.artistName, GR.genre, ES.lastModifiedOn, EN.voteStatus, 
ES.notified
FROM recEntrantStatus AS ES
LEFT JOIN recEntrants AS EN
ON ES.entrantId = EN.Id
LEFT JOIN recGenre AS GR
ON EN.genreId = GR.Id
WHERE ES.roundId = 2

ただし、達成する必要があるのは、各メンバーの最新のステータス更新/レコードを取得することです。

Ps recEntrantStatus に modifiedDate 列があります

これに関する任意の助けをいただければ幸いです。

前もって感謝します。

4

3 に答える 3

1

row_number() over を使用し(partition by ES.entrantId order by ES.lastModifiedOn desc)ます。同じ順序を使用する必要がある場合は、サブクエリに[列の順序]リストを追加してください。また、代わりにをNO status records使用しているレコードを選択する必要がある場合LEFT JOINJOIN

SELECT * FROM (
    SELECT EN.Id, EN.artistName, GR.genre, ES.lastModifiedOn, EN.voteStatus, 
       ES.notified,
       row_number() over (partition by ES.entrantId order by ES.lastModifiedOn desc) rn 
    FROM recEntrantStatus AS ES
    JOIN recEntrants AS EN
        ON ES.entrantId = EN.Id JOIN recGenre AS GR
        ON EN.genreId = GR.Id AND ES.judgeId = @judgeId AND ES.roundId > 0
) A
WHERE A.rn = 1
--ORDER BY A.voted DESC, A.roundId, A.Id

編集(OP編集による):

SELECT * FROM (
    SELECT ES.entrantId Id, EN.artistName, GR.genre, ES.lastModifiedOn, EN.voteStatus, 
       ES.notified,
       row_number() over (partition by ES.entrantId order by ES.lastModifiedOn desc) rn 
    FROM recEntrantStatus AS ES
    LEFT JOIN recEntrants AS EN
        ON ES.entrantId = EN.Id LEFT JOIN recGenre AS GR
        ON EN.genreId = GR.Id 
    --AND ES.judgeId = @judgeId 
    WHERE ES.roundId = 2
) A
WHERE A.rn = 1
于 2013-01-31T16:26:27.480 に答える
0

これは、その列の変更日時を含むModifiedDate列を追加せずに行うことはできません。次に、これを行うことができます:

select * from tableA where whatever='whatever' order by ModifiedDate desc

また、更新または挿入が発生するたびにこの列を変更する挿入/更新トリガーを調べることもできます。

ただし、最初のエントリだけが必要な場合は、TOP()

于 2013-01-31T16:14:28.443 に答える
0

これを試して:

;WITH MostRecent
AS
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY entrantId ORDER BY lastModifiedOn DESC) RN,
        entrantId,
        judgeId,
        roundId,
        voted 
    FROM recEntrantStatus
)
SELECT
    EN.Id,
    EN.artistName,
    GR.genre,
    ES.lastModifiedOn,
    EN.voteStatus, 
    ES.notified
FROM MostRecent AS ES
    JOIN recEntrants AS EN
ON ES.entrantId = EN.Id
    JOIN recGenre AS GR
ON EN.genreId = GR.Id
   AND ES.judgeId = @judgeId
   AND ES.roundId > 0
WHERE ES.RN = 1
ORDER BY ES.voted DESC, ES.roundId, EN.Id
于 2013-01-31T16:18:26.493 に答える