1

我想用主表中的记录子集创建一个表。例如,我有:

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)

但不工作。

4

3 回答 3

3

假设您想选择idper最大值的行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
 )
)
于 2013-07-11T13:50:14.610 回答
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)
于 2013-07-11T13:47:32.823 回答
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
于 2013-07-11T13:56:27.233 回答