SQL-запрос для последней категории сотрудников, у каждого из которых несколько записей с одинаковым идентификатором

0

Как найти последний класс сотрудника имеет тот же идентификатор. мой стол выглядит так:

+----+-------+-------+
| ID |  NAME | GRADE | 
| 1  |  ANN  |  A0   | 
| 1  |  ANN  |  A3   |  
| 2  |  JOE  |  B1   | 
| 3  | KIM   |  B3   | 
| 2  | JOE   |  B2   | 
| 3  | KIM   |  C1   | 
| 3  | KIM   |  C3   | 
+----+-------+-------+

Как найти последний сорт ann, Kim и joe

мой результат похож:

name latestgrade
ann  A3
joe  B2
kim  C3
Теги:
sql-server

2 ответа

0

попробуйте row_number

;with cte 
as
(
 SELECT
   SeqNo = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY 
SUBSTRING(GRADE,1,1) desc,CAST(SUBSTRING(GRADE,2,LEN(GRADE)) AS INT) DESC),
       *
       FROM YourTable
    )
    SELECT
    * 
    FROM CTE
    WHERE SeqNo = 1

Если вы хотите вставить вышеуказанный результат в новую таблицу, просто напишите вставку перед выбором

;with cte 
    as
    (
     SELECT
       SeqNo = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY 
    SUBSTRING(GRADE,1,1) desc,CAST(SUBSTRING(GRADE,2,LEN(GRADE)) AS INT) DESC),
           *
           FROM YourTable
        )
insert into MyNewTable
        SELECT
        * 
        FROM CTE
        WHERE SeqNo = 1
  • 0
    Если A10 & A9 есть в качестве Grade значений, ваш код будет выбрать A9 . Надеюсь, он должен выбрать A10 .
  • 0
    следует выбрать A10
Показать ещё 12 комментариев
0

Дайте группе номеров строк по идентификатору и порядку по убыванию порядку класса

Серверный запрос Sql

;with cte as(
    select [rn] = row_number() over(
        partition by [ID]
        order by len([GRADE]) desc, [GRADE] desc
    ), *
    from [your_table_name]
)
select [ID], [NAME], [GRADE]
from cte
where [rn] = 1;

демонстрация

MySql Query

select t1.'ID', t1.'NAMME', t1.'GRADE' from (
    select 'ID', 'NAME', 'GRADE', (
        case 'ID' when @curA 
        then @curRow := @curRow + 1 
        else @curRow := 1 and @curA := 'ID' end 
    ) as 'rn' 
    from 'your_table_name' t, 
    (select @curRow := 0, @curA := '') r 
    order by 'ID', length('GRADE') desc, 'GRADE' desc
)t1 
where t1.'rn' = 1;

демонстрация

Ещё вопросы

Сообщество Overcoder
Наверх
Меню