2

次の表

CREATE TABLE [dbo].[Poll](
    [PollID] [bigint] IDENTITY(1,1) NOT NULL,
    [LoginID] [bigint] NOT NULL,
    [FacilityID] [bigint] NOT NULL,
    [PolledAt] [datetime] NOT NULL,
)

PolledAtこのテーブルを毎晩空にする必要があります...ただし、フィールドごとにグループ化されたフィールドに基づいて最大行を残しLoginIDます。つまり、ユーザー(LoginID)には複数の行があり、夜の終わりまでに、ユーザーは削除後に1行だけを持つ必要があります。その行がMAX(PolledAt)値である必要があります。

これで削除したくないレコードを取得できます:

SELECT
    LoginID,
    MAX(PolledAt) AS MaxPolledAt
FROM
    Poll
GROUP BY
    LoginID

しかし、私はポリッドである主キーを表示していないので、削除を形成する方法がわかりません。上記のselectの結果を取得し、selectが返すものを除くすべてを削除する必要があります。

4

1 に答える 1

4

共通テーブル式row_number()関数を使用して、削除する必要のある行を特定できます。

SQLフィドル

MS SQL Server 2008スキーマのセットアップ

CREATE TABLE [dbo].[Poll](
    [PollID] [bigint] IDENTITY(1,1) NOT NULL,
    [LoginID] [bigint] NOT NULL,
    [FacilityID] [bigint] NOT NULL,
    [PolledAt] [datetime] NOT NULL,
);


insert into Poll values(1, 1, getdate());
insert into Poll values(1, 1, getdate()+1);
insert into Poll values(1, 1, getdate()+2);
insert into Poll values(1, 1, getdate()+3);
insert into Poll values(2, 2, getdate()+4);

クエリ1

with C as
(
  select row_number() over(partition by LoginID order by PolledAt desc) as rn
  from Poll
)
delete from C
where rn > 1;

結果

クエリ2

select *
from Poll;

結果

| POLLID | LOGINID | FACILITYID |                        POLLEDAT |
-------------------------------------------------------------------
|      4 |       1 |          1 | February, 08 2013 21:48:34+0000 |
|      5 |       2 |          2 | February, 09 2013 21:48:34+0000 |
于 2013-02-05T21:42:23.883 に答える