Как получить максимальную дату в месяц, используя SQL

Что-то пошло не так, и я понимаю, что не получаю то, что хочу. У меня есть следующие строки в таблице:

0000527746  1000    10.06.2017  20170718100757.5010080
0000527746  1000    10.06.2017  20170718100757.5039300
0000527746  1000    11.06.2017  20170718100839.9209480
0000527746  1000    11.06.2017  20170718100906.3337170
0000527746  1000    24.07.2017  20170718095843.3555610
0000527746  1000    24.07.2017  20170718100209.2203570
0000527746  1000    24.07.2017  20170718100757.4970390

и я хочу выбрать последнюю дату каждого месяца, а именно я хочу, чтобы выбор принес мне следующие строки

0000527746  1000    11.06.2017  20170718100906.3337170
0000527746  1000    24.07.2017  20170718100757.4970390

Я использую следующий sql

select bukrs kunnr dat max( time ) as time
    from zcollectoraction into corresponding fields of table it_collectoraction
    where bukrs = p_bukrs and
          kunnr in so_kunnr and
          dat   in so_date
    group by bukrs kunnr dat.

но он отображает следующие строки

0000527746  1000    11.06.2017  20170718100906.3337170
0000527746  1000    11.06.2017  20170718100906.3337170
0000527746  1000    24.07.2017  20170718100757.4970390

Что делать, чтобы иметь 1 линию в месяц?

3 ответа

Я думаю, что есть два решения по этому вопросу. 1) Вы можете добавить поле yearmonth к вашей таблице базы данных. И добавьте это поле в группу по заявке.

0000527746  1000    10.06.2017  20170718100757.5010080 201706
0000527746  1000    10.06.2017  20170718100757.5039300 201706
0000527746  1000    11.06.2017  20170718100839.9209480 201706
0000527746  1000    11.06.2017  20170718100906.3337170 201706
0000527746  1000    24.07.2017  20170718095843.3555610 201707
0000527746  1000    24.07.2017  20170718100209.2203570 201707
0000527746  1000    24.07.2017  20170718100757.4970390 201707

select bukrs kunnr dat max( time ) as time
    from zcollectoraction into corresponding fields of table 
    it_collectoraction
    where bukrs = p_bukrs and
          kunnr in so_kunnr and
          dat   in so_date
    group by bukrs kunnr dat yearmonth.

2) Вы можете выбрать все данные и расположить их в цикле. Или вы можете использовать ваш старый запрос выбора не имеет значения вообще.

select bukrs kunnr dat time
    from zcollectoraction into corresponding fields of table 
    it_collectoraction
    where bukrs = p_bukrs and
          kunnr in so_kunnr and
          dat   in so_date .

loop at it_collectoraction into data(ls_coll).
   delete it_collectoraction[] WHERE dat(6) = ls_coll-dat(6) 
                                 and dat < = ls_coll-dat 
                                 and time < ls_coll-time.
endloop.

Что вам нужно, это group by не dat, но по месяцам и годам - ​​этот пункт будет работать:

GROUP BY bukrs, kunnr, MONTH(dat), YEAR(dat)

Здравствуйте и спасибо за ваши ответы. Я решил проблему, выполнив 2 выбора. В 1-й день я получаю последний день или дни месяца со следующим выбором

select bukrs kunnr yearmonth max( dat ) as dat
    from zcollectoraction into corresponding fields of table it_collectoraction
    where bukrs = p_bukrs and
          kunnr in so_kunnr and
          dat   in so_date
    group by bukrs kunnr yearmonth.

а затем я сделал цикл во внутренней таблице, чтобы заполнить оставшиеся данные и выбрать максимальное время для всех записей, особенно когда на букрс, куннр и дату приходится более 1 строки.

select single * from zcollectoraction 
                        into corresponding fields of wa_collectoraction
  where bukrs = wa_collectoraction-bukrs and
        kunnr = wa_collectoraction-kunnr and
        dat   = wa_collectoraction-dat   and
        time  = ( select max( time ) as time
                    from zcollectoraction
                    where bukrs = wa_collectoraction-bukrs and
                          kunnr = wa_collectoraction-kunnr and
                          dat   = wa_collectoraction-dat ).

Еще раз спасибо Элиас

Другие вопросы по тегам