2016-05-17 42 views
3

我有一张约50k记录的表格。它看起来是这样的:如何将值作为不同的列插入?

Animal | Name | Color | Legs 
Cat |George| Black | 4 
Cat | Bob | Brown | 4 
Cat | Dil | Brown | 4 
Bird | Irv | Green | 2 
Bird | Van | Red | 2 

我只想插入猫一次,鸟只有一次,依此类推。名称/颜色/腿等应该是它找到的第一个值。

该表格有10列和50k行。

我试过insert into MyNewTable Select Distinct * From MyAnimalTable,但没有奏效。我也试过group by,但也没有工作。

+1

*姓名/颜色/腿等应该是冷杉st值它找到。* ...首先根据哪个字段? –

+0

这里没有“第一”。如何选择插入哪只猫? – jarlh

+0

是否必须让名称,颜色和双腿保持一致(即George/Black或Bob/Brown或Dil/Brown是否允许,但不包括George/Brown,Bob/Black,Dil/Black)? –

回答

3

您可以仅使用动物名称的组,然后从Max()中选择其余列以获得第一个发现。

insert into MyNewTable 
Select MAT.Animal,max(MAT.Name),max(MAT.Color),max(MAT.Legs) 
From MyAnimalTable MAT GROUP BY MAT.Animal 
+0

谢谢Mat.etc真的有必要吗? –

+0

完全不是,但它有很好的表格别名,可以很好地理解我们在单个查询中多次进行裁判的表格。 –

2

使用ROW_NUMBER到数每个动物的行只保留的那些编号为1

insert into mynewtable (animal, name, color, legs) 
select animal, name, color, legs 
from 
(
    select 
    animal, name, color, legs, 
    row_number() over (partition by animal order by animal) as rn 
    from myanimaltable a 
) numbered 
where rn = 1; 

(这个数字每只动物记录随意。所以,你得到每个动物的第一条记录“数据库管理系统发现”。如果你想要任何特定的命令,你必须在分区子句后面指定它。)

+0

查询中有太多错误 –

+0

@Prdp:感谢您提供有用的评论。 –

+0

代码应为: 'row_number()over(按动物顺序按[order column]分区)作为rn' [order column]应该是您想要决定哪一行是第一个的列。 –

0

尝试这样,

SELECT A.Animal 
    ,B.NAME 
    ,C.color 
    ,A.Legs 
FROM (
    SELECT DISTINCT Animal 
     ,Legs 
    FROM tablename 
    ) A 
CROSS JOIN (
    SELECT DISTINCT NAME 
    FROM tablename 
    ) B 
CROSS JOIN (
    SELECT DISTINCT Color 
    FROM tablename 
    ) C 
0

你可以尝试以下方法:

INSERT INTO MYNEWTABLE 
select Animal,Name,Color,legs from 
(select distinct Animal,Name,Color,legs,dense_rank() over(partition by animal) 
as rnk from table) AS T 
0

最简单的解决方案为您的查询

​​
相关问题