Номер строки в зависимости от года

#sql #sql-server #tsql

Вопрос:

Это мои результаты

 Row     DocDate             CardCode    ItmsGrpNam
1   2019-01-23 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
2   2019-01-23 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
1   2021-09-07 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
 

Может ли столбец «Строка» основываться на году. если в том же году он должен быть «1» для года «2019»

    Row  DocDate                 CardCode    ItmsGrpNam
    1   2019-01-23 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
    1   2019-01-23 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
    2   2021-09-07 00:00:00.000 C-SGD-1817  MH-PltTruck/Hand
 

Ниже приведен мой запрос:

 select row_number() over (partition by o3.CardCode, o3.ItmsGrpNam, Year(o3.DocDate) order by o3.DocDate) [row]
    , o3.DocDate, o3.CardCode, o3.ItmsGrpNam
from OINV o3
 

Комментарии:

1. Вы пробовали rank

2. DENSE_RANK() над (раздел по T0.Код карты,T3.ItmsGrpNam,Год(T0. DocDate) порядок по годам(t0. Докдейт) )[строка]. Я пробовал так, это все равно то же самое, все как»1″

Ответ №1:

Вам нужно удалить год из раздела и использовать dense_rank функцию.

 select dense_rank() over (partition by o3.CardCode, o3.ItmsGrpNam order by Year(o3.DocDate)) [row]
    , o3.DocDate, o3.CardCode, o3.ItmsGrpNam
from OINV o3
 

db<>скрипка

Комментарии:

1. partition by o3.CardCode, o3.ItmsGrpNam часто замедляйте запрос. Разбиение на колонну varchar — всегда плохая идея. Более того, в вашем образце скрипки, который я протестировал, это partition by o3.CardCode, o3.ItmsGrpNam не требуется.просто удалите его. Только dense_rank() over ( order by Year(o3.DocDate)) будет работать