2016-07-21 2 views
0

У меня есть таблица, как показано ниже. Я хочу добавить столбец с именем Number, который должен увеличиться, основанный на Cluster и DriveNumber (или Cluster + Date + DriveNumber:Как добавить столбец, где значение увеличивается на основе другого столбца

Cluster   Cluster + Sub-cluster DriveNumbe Date 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   12/9/2015 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   12/9/2015 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   1/4/2016 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   1/4/2016 
L700_NEDCC41 L700_NEDCC41   1+2+3  12/9/2015 
L700_NEDCC41 L700_NEDCC41   1+2+3  16/11/2015 
L700_NEDCC41 L700_NEDCC41   1+2+3  09/12/2016 

Нужный результат:

Cluster   Cluster + Sub-cluster DriveNumbe Date  Number 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   12/9/2015 1 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   12/9/2015 1 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   1/4/2016 2 
GCR_OPT_WELAC01 GCR_OPT_WELAC01   1+2   1/4/2016 2 
L700_NEDCC41 L700_NEDCC41   1+2+3  12/9/2015 1 
L700_NEDCC41 L700_NEDCC41   1+2+3  16/11/2015 2 
L700_NEDCC41 L700_NEDCC41   1+2+3  09/12/2016 2 
+2

Тэг свой вопрос с базой данных, которую вы используете. –

ответ

0

Вы можете сделать это с помощью ANSI SQL-функция окна dense_rank():

select t.*, 
     dense_rank() over (partition by cluster, drivenumber order by date) as number 
from t; 

MySQL не поддерживает эти функции. Вместо этого, вы можете сделать:

select t.*, 
     (select count(distinct t2.date) 
     from t t2 
     where t2.cluster = t.cluster and t2.drivenumber = t.drivenumber and 
       t2.date <= t.date 
     ) as number 
from t; 
+0

- та же функция доступна в mysql – user2503377

+0

Спасибо, я получаю желаемый результат. – user2503377

+0

То же самое можно сделать по нижнему запросу – user2503377

0
set @pk1 =''; 
set @rn1 =1; 
set @sal =''; 
set @val =1; 

SELECT dept_id, 
    salary, 
    denseRank 
FROM 
(
SELECT dept_id, 
     salary, 
     @rn1 := if(@pk1=dept_id, if(@sal=salary, @rn1, @[email protected]),1) as  denseRank, 
     @val := if(@pk1=dept_id, if(@sal=salary, @val+1, 1),1) as value, 
     @pk1 := dept_id, 
     @sal := salary  
    FROM 
(
    SELECT dept_id, 
     salary 
FROM emp 
ORDER BY dept_id,salary 
) A 
) B; 
+0

Это опасный код. Предполагается, что выражения в 'select' оцениваются по порядку. Это не только не гарантируется, но MySQL действительно оценивает выражения вне порядка (иногда). –

Смежные вопросы