我使用SQL Server 2014 Express。
我有一张包含各种职业战斗信息的表格。我已经为每一行分配了自己的战斗ID。
有时,使用不同的战斗ID会多次记录有关同一战斗的信息。我的目标是识别这些重复项,然后从我的表中删除它们。
这是创建我的表的代码:
CREATE TABLE [dbo].[Fights](
[FightId] [int] IDENTITY(1,1) NOT NULL,
[LowIdFighter] [int] NOT NULL,
[HighIdFighter] [int] NOT NULL,
[LowIdFighterOutcome] [nvarchar](100) NOT NULL,
[EventName] [nvarchar](100) NOT NULL,
[EventDate] [datetime] NOT NULL,
[WinningMethod] [nvarchar](100) NOT NULL,
[Referee] [nvarchar](50) NOT NULL,
[FinishingRound] [int] NOT NULL,
[FinishingTime] [time](7) NOT NULL,
CONSTRAINT [PK_Fights] PRIMARY KEY CLUSTERED
(
[FightId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
这是我的问题:
SELECT
LowIdFighter, HighIdFighter, CAST(EventDate AS DATE),
LowIdFighterOutcome,
COUNT(*) as NumTimesSaved
INTO Duplicate_Fights
FROM Fights
GROUP BY
LowIdFighter, HighIdFighter, EventDate,
LowIdFighterOutcome
HAVING COUNT(*) > 1;
GO
我的问题是:表Duplicate_Fights包含实际上并不重复的战斗。战斗被认为是重复的,因为它们在任何四列中的两列(LowIdFighter,HighIdFighter,EventDate,LowIdFighterOutcome)中共享相同的值。例如,如果两个战斗共享相同的LowIdFighter-HighIdFighter对,则认为两个战斗相互重复,即使这两个战斗机在两个完全不同的事件中作战,可能有两个完全不同的结果。显然,这不是我想要的。
我想编写一个查询表达式,该表达式返回重复战斗的表,这些战斗在四列的 all 中共享相同的值。我很感激有关此事的任何帮助。谢谢。
编辑:这是我排除" HAVING COUNT(*)>时输出的屏幕截图1"语句:
第149行和第150行不彼此重复,因为这两行中的日期不同,但它们包含在重复战斗表中。
答案 0 :(得分:1)
这两行并不相互重复,但两者都存在两次,即战斗机45386
有两次战斗,两次都被插入两次。
答案 1 :(得分:1)
我只是想帮忙。
您的查询应该按照 dnoeth 的建议运行,但只需确保在 GROUP BY中使用相同属性(或其操作)用于检索列(中的)的子句</ em>,如下所示:
SELECT
LowIdFighter, HighIdFighter, CAST(EventDate AS DATE),
LowIdFighterOutcome,
COUNT(*) as NumTimesSaved
INTO Duplicate_Fights
FROM Fights
GROUP BY
LowIdFighter, HighIdFighter, CAST(EventDate AS DATE),
LowIdFighterOutcome
HAVING COUNT(*) > 1;
GO