2013-02-21 2 views
0

У меня есть следующие данные:row_number несколькими колоннами

type id date1 date2 diff 
-----------------------------------  
blue 1  x1  xxx  18 
blue 1  x2  -   - 
red 1  x1  -   - 
blue 2  x1  xx  15 
blue 2  x2  xx  18 
blue 2  x3  -  - 

И я хочу, чтобы добавить row_number, чтобы получить данные, как это:

type id date1 date2 diff row_number 
--------------------------------------------- 
blue 1  x1  xxx  18  1 
blue 1  x2  -   -  2 
red 1  x1  -   -  1 
blue 2  x1  xx  15  1 
blue 2  x2  xx  18  2 
blue 2  x3  -  -  3 

И.Э. сначала сортировать по типу, затем по id и последней дате.

Я пробовал следующий синтаксис:

Create table t(type char(7), id int(13), date1 date, date2 date, diff int, row_number int) ; 

Insert into t(type, id, date1, date2, diff, row_number) 

    (SELECT a.type, a.id, a.date1, a.date2, a.diff 
    FROM 
     (Select 
      type, id, date1, date2, diff, row_number() over (order by type, id, date1) as r 
     from table) a 
    order by 
     a.type, a.id, a.date1; 

Синтаксис выше не работает, и я получаю сообщение об ошибке:

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует вашей версии MYSQL ....

Я попытался проще синтаксис, чтобы посмотреть, если команда работы, как:

SELECT 
    type,  
    ROW_NUMBER() OVER (PARTITION BY type, id, date1 ORDER By type, lpnr, date1) as t, 
    id, 
    date1 
FROM table; 

или

select 
    row_number() over(order by id), 
    id 
from table; 

и все равно получите то же сообщение об ошибке.

Не могли бы вы рассказать мне, что я делаю неправильно, или если row_number не работает в версиях MYSQL (у меня есть heidi и workbench)? Если команда не работает, есть ли другой способ делать то, что я хочу сделать?

Большое вам спасибо за помощь!

Linda

+0

Вы правы, MySQL не поддерживает стандартные функции окна. Вам понадобится обходное решение, отправленное Томом. –

ответ

1

К сожалению, я не верю, что MySQL предоставляет аналитические функции, которые вы пытаетесь использовать ROWNUMBER() OVER PARTITION то есть;

Однако это не означает, что он не может быть получен с использованием других средств. Дайте этому ходу:

create table myTable (type varchar(50) not null,id int(10) unsigned not null, 
date1 varchar(10) default null,date2 varchar(10) default null,diff int unsigned default null 
); 

insert into myTable (type,id,date1,date2,diff) values ('blue',1,'x1','xxx',18); 
insert into myTable (type,id,date1,date2,diff) values ('blue',1,'x2',null,null); 
insert into myTable (type,id,date1,date2,diff) values ('red',1,'x1',null,null); 
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x1','xx',15); 
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x2','xx',18); 
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x3',null,null); 

select t.type,t.id,t.date1,t.date2,t.rownum 
from 
(
select mt.type,mt.id,mt.date1,mt.date2,mt.diff, 
case 
when mt.id = @curId and mt.type = @curType then @curRow := @curRow + 1 
    else @curRow := 1 
END as rownum, 
@curId := mt.id, 
@curType := mt.type 
from myTable mt 
join (select @curRow := 0, @curId := -1,@curType="") r 
order by mt.id,mt.type 
) t; 
Смежные вопросы