如何在不使用 SQL 中的 DISTINCT 的情况下删除重复值?
How to remove duplicate values without using DISTINCT in SQL?
我有一个临时 table 一列:
OfficeID
-----
0
1
1
1
60
60
61
61
61
61
317
317 <----
63 <----
63
63
63
63
当我使用 Distinct
删除重复值时,SQL 对结果进行排序,如下所示,但我不想对其进行排序。
OfficeID
--------
0
1
60
61
63 <---
317 <---
我想要这个没有重复值且没有排序的结果
OfficeID
----------
0
1
60
61
317 <---
63 <---
您使用了 GROUP BY 删除重复值而不使用 distinct 函数。
分组依据 最佳。
试试这个查询。
SELECT columnname FROM temptable GROUP BY columnname
您可以简单地将其放在查询的末尾:
ORDER BY Rnd([PrimaryKey]);
这里,PrimaryKey 是 table 的主键。这将使您的结果显示为未排序。
如果您无法更改实际的 table 结构,我只能想到一种方法来实现这一点,那就是使用临时 Table 或 Table 变量。在我下面的测试设置中,我选择了后者。
首先你需要一个 IDENTITY
列来 'store' 事物的顺序:
DECLARE @TempTable TABLE
(
TempID INT IDENTITY(1, 1)
, OfficeID INT
);
然后按原样使用事物的顺序填充它(没有 ORDER BY
):
INSERT INTO @TempTable (OfficeID)
SELECT OfficeID
FROM OfficeIDs;
现在,如果我们有,我们可以使用 ROW_NUMBER()
带来一些魔力,在这种情况下,它仅用于选择每个 OfficeID 系列的第一项:
SELECT
OfficeID
FROM (SELECT
*
, ROW_NUMBER() OVER (PARTITION BY OfficeID ORDER BY TempID) SortOrder
FROM @TempTable) AS t
WHERE t.SortOrder = 1
ORDER BY TempID;
请注意,我需要 ORDER BY @TempTable.TempID
以保持原始排序。
我的测试结果:
OfficeID
-----------
0
1
60
61
317
63
(6 rows affected)
Completion time: 2020-01-01T13:44:14.9947886+01:00
SQL tables代表无序集合。没有顺序,除非列指定顺序。
如果您的临时 table 只有一列,则无法保证原始顺序。 . .因为它没有定义。
您可以做的是用两列定义您的临时table。如果您明确定义 table:
create table #temptable (
id int identity(1, 1) primary key,
OfficeId int
);
然后像往常一样插入:
insert into #temptable (OfficeId)
. . . ;
或者,如果您使用 into
创建 table,则:
select identity(1, 1) as id, . . .
into #temptable
. . .
在这两种情况下,标识列都会捕获插入顺序。
那么你想做的就很简单了:
select officeId
from #temptable
group by officeId
order by min(id);
我找到解决方案:
我必须为临时文件使用 IDENTITY 列 table
SELECT OfficeID,IDENTITY(int) AS idcol
INTO #temp
SELECT *
FROM ( SELECT OfficeID ,
ROW_NUMBER() OVER ( PARTITION BY OfficeID ORDER BY idcol ) rn ,
idcol
FROM #temp
) result
WHERE rn = 1
ORDER BY result.idcol DESC;
我有一个临时 table 一列:
OfficeID
-----
0
1
1
1
60
60
61
61
61
61
317
317 <----
63 <----
63
63
63
63
当我使用 Distinct
删除重复值时,SQL 对结果进行排序,如下所示,但我不想对其进行排序。
OfficeID
--------
0
1
60
61
63 <---
317 <---
我想要这个没有重复值且没有排序的结果
OfficeID
----------
0
1
60
61
317 <---
63 <---
您使用了 GROUP BY 删除重复值而不使用 distinct 函数。
分组依据 最佳。
试试这个查询。
SELECT columnname FROM temptable GROUP BY columnname
您可以简单地将其放在查询的末尾:
ORDER BY Rnd([PrimaryKey]);
这里,PrimaryKey 是 table 的主键。这将使您的结果显示为未排序。
如果您无法更改实际的 table 结构,我只能想到一种方法来实现这一点,那就是使用临时 Table 或 Table 变量。在我下面的测试设置中,我选择了后者。
首先你需要一个 IDENTITY
列来 'store' 事物的顺序:
DECLARE @TempTable TABLE
(
TempID INT IDENTITY(1, 1)
, OfficeID INT
);
然后按原样使用事物的顺序填充它(没有 ORDER BY
):
INSERT INTO @TempTable (OfficeID)
SELECT OfficeID
FROM OfficeIDs;
现在,如果我们有,我们可以使用 ROW_NUMBER()
带来一些魔力,在这种情况下,它仅用于选择每个 OfficeID 系列的第一项:
SELECT
OfficeID
FROM (SELECT
*
, ROW_NUMBER() OVER (PARTITION BY OfficeID ORDER BY TempID) SortOrder
FROM @TempTable) AS t
WHERE t.SortOrder = 1
ORDER BY TempID;
请注意,我需要 ORDER BY @TempTable.TempID
以保持原始排序。
我的测试结果:
OfficeID
-----------
0
1
60
61
317
63
(6 rows affected)
Completion time: 2020-01-01T13:44:14.9947886+01:00
SQL tables代表无序集合。没有顺序,除非列指定顺序。
如果您的临时 table 只有一列,则无法保证原始顺序。 . .因为它没有定义。
您可以做的是用两列定义您的临时table。如果您明确定义 table:
create table #temptable (
id int identity(1, 1) primary key,
OfficeId int
);
然后像往常一样插入:
insert into #temptable (OfficeId)
. . . ;
或者,如果您使用 into
创建 table,则:
select identity(1, 1) as id, . . .
into #temptable
. . .
在这两种情况下,标识列都会捕获插入顺序。
那么你想做的就很简单了:
select officeId
from #temptable
group by officeId
order by min(id);
我找到解决方案:
我必须为临时文件使用 IDENTITY 列 table
SELECT OfficeID,IDENTITY(int) AS idcol
INTO #temp
SELECT *
FROM ( SELECT OfficeID ,
ROW_NUMBER() OVER ( PARTITION BY OfficeID ORDER BY idcol ) rn ,
idcol
FROM #temp
) result
WHERE rn = 1
ORDER BY result.idcol DESC;