我想用主表中的记录子集创建一个表。例如,我有:
id name code
1 peter 73
2 carl 84
3 jack 73
我想存储彼得和卡尔但不是杰克,因为彼得的代码相同。我需要高性能,因为我有 20M 记录。
我试试这个:
SELECT id, name, DISTINCT(code) INTO new_tab
FROM old_tab
WHERE (conditions)
但不工作。
我想用主表中的记录子集创建一个表。例如,我有:
id name code
1 peter 73
2 carl 84
3 jack 73
我想存储彼得和卡尔但不是杰克,因为彼得的代码相同。我需要高性能,因为我有 20M 记录。
我试试这个:
SELECT id, name, DISTINCT(code) INTO new_tab
FROM old_tab
WHERE (conditions)
但不工作。
假设您想选择id
per最大值的行code
,那么应该这样做:
insert into new_tab (id, name, code)
(SELECT id, name, code
FROM
(
SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id DESC)
FROM old_tab WHERE rnk = 1
)
)
对于每个代码的最小值id
,只需将排名中的排序顺序从 DESC 更改为 ASC:
insert into new_tab (id, name, code)
(SELECT id, name, code
FROM
(
SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id ASC)
FROM old_tab WHERE rnk = 1
)
)
使用派生表,您可以找到每个代码的 minID,然后连接到外部代码中以从 oldTab 中获取该 ID 的其余列。
select id,name,code
insert into newTabFROM
from old_tab t inner join
(SELECT min(id) as minId, code
from old_tab group by code) x
on t.id = x.minId
WHERE (conditions)
试试这个:
CREATE TABLE #Temp
(
ID INT,
Name VARCHAR(50),
Code INT
)
INSERT #Temp VALUES (1, 'Peter', 73)
INSERT #Temp VALUES (2, 'Carl', 84)
INSERT #Temp VALUES (3, 'Jack', 73)
SELECT t2.ID, t2.Name, t2.Code
FROM #Temp t2
JOIN (
SELECT t.Code, MIN(t.ID) ID
FROM #temp t
JOIN (
SELECT DISTINCT Code
FROM #Temp
) d
ON t.Code = d.Code
GROUP BY t.Code
) b
ON t2.ID = b.ID