【发布时间】:2019-05-21 10:17:09
【问题描述】:
在下表中,主键是:Id、ClientId、CertificateId。 AccountId 列是重复的,因为 AccountId 可能有不同的客户,而客户可能有不同的证书。 下面是用于操作表和数据的脚本。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableB](
[Id] [int] NOT NULL,
[ClientId] [int] NOT NULL,
[CertificateId] [int] NOT NULL,
[AccountId] [int] NOT NULL,
[Status] [bit] NULL,
CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED
(
[Id] ASC,
[ClientId] ASC,
[CertificateId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (1, 5, 34, 1, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (2, 8, 34, 1, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (3, 7, 36, 2, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (4, 9, 37, 3, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (5, 10, 35, 4, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (6, 4, 37, 4, 0)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (7, 61, 34, 4, 1)
INSERT [dbo].[TableB] ([Id], [ClientId], [CertificateId], [AccountId], [Status]) VALUES (8, 45, 35, 5, 1)
GO
当我执行这个查询时:SELECT * FROM TableB WHERE [Status]=1 我得到以下结果
Id | ClientId | CertificateId | AccountId | Status
1 | 5 | 34 | 1 | 1
2 | 8 | 34 | 1 | 1
3 | 7 | 36 | 2 | 1
4 | 9 | 37 | 3 | 1
5 | 10 | 35 | 4 | 1
7 | 61 | 34 | 4 | 1
8 | 45 | 35 | 5 | 1
请帮助我得到以下结果,意味着如果任何 AccountId 重复然后选择前 1 并且输出应该是这样的
Id | ClientId | CertificateId | AccountId | Status
1 | 5 | 34 | 1 | 1
3 | 7 | 36 | 2 | 1
4 | 9 | 37 | 3 | 1
5 | 10 | 35 | 4 | 1
8 | 45 | 35 | 5 | 1
【问题讨论】:
-
select * from (select *, RN = row_number() over (partition by AccountId order by Id) from TableB where [Status] = 1) x where RN = 1
标签: sql sql-server