我想创建一个包含主表中记录子集的表。 例如,我有:
id name code
1 peter 73
2 carl 84
3 jack 73
我想存储peter和carl但不是jack,因为它有相同的peter代码。 我需要高性能,因为我有20M的记录。
我试试这个:
SELECT id, name, DISTINCT(code) INTO new_tab
FROM old_tab
WHERE (conditions)
但不起作用。
答案 0 :(得分:3)
假设您要选择每id
最多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
)
)
答案 1 :(得分: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)
答案 2 :(得分:0)
试试这个:
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