2016-05-17 2 views
3

У меня есть таблица около 50 тыс. Записей. Это выглядит примерно так:Как вставить значения в виде отдельного столбца?

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

т.д.

Я хочу, чтобы вставить только один раз и Cat Bird только один раз и так далее. Имя/Цвет/Ноги и т. Д. Должны быть первым значением, которое оно находит.

В этой таблице 10 столбцов и 50 тыс. Строк.

Я пробовал insert into MyNewTable Select Distinct * From MyAnimalTable, но это не сработало. Я также пробовал group by, но не работал.

+1

* Имя/цвет/Ноги и т. Д. Должны быть пихтой которое оно находит. * ... сначала в соответствии с какой областью? –

+0

Здесь нет «первого». Как выбрать, какой кот вставить? – jarlh

+0

Должны ли быть согласованы имя, цвет и ноги (например, Джордж/Черный или Боб/Браун или Дил/Браун, но не Джордж/Браун, Боб/Черный, Дил/Черный) или нет? –

ответ

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 (раздел по заказу животных по колонке заказа) как rn' Столбец [столбец заказа] должен быть столбцом, по которому вы хотите решить, какая строка является первой. –

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

Лучшее простое решение для вашего запроса

select 
Animal, 
(select top 1 name from MyAnimalTable where animal=T.animal) Name, 
(select top 1 Color from MyAnimalTable where animal=T.animal) Color, 
(select top 1 Legs from MyAnimalTable where animal=T.animal) Legs 
from MyAnimalTable T group by Animal 
Смежные вопросы