Максимальное число за каждый месяц - PullRequest
0 голосов
/ 10 июля 2020

Ниже вы можете увидеть пример моей таблицы:

test_id     test_date     test_date_from    cash_per_step
1           2020-01-01    2019-12-30        30
1           2020-01-21    2019-12-30        40
1           2020-02-28    2019-12-30        30
2           2020-01-01    2019-12-30        30
2           2020-01-21    2019-12-30        40
2           2020-02-28    2019-12-30        30

Как видите, уникального идентификатора нет (к сожалению, я тоже не могу его изменить). Я хочу создать представление, которое ТОЛЬКО содержит строки, содержащие MAX (test_date) для каждого МЕСЯЦА для каждого test_id!

Вот так:

test_id     test_date     test_date_from    cash_per_step
1           2020-01-21    2019-12-30        40
1           2020-02-28    2019-12-30        30
2           2020-01-21    2019-12-30        40
2           2020-02-28    2019-12-30        30

Данные являются только тестовыми данными Извините, пожалуйста, что это двойной. Меня интересует только функциональность запроса.

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Это должно работать как на MySQL (8.0+), так и на SQL сервере.

SELECT DISTINCT
    test_id,
    FIRST_VALUE(test_date) OVER (PARTITION BY test_id,MONTH(test_date), YEAR(test_date) 
                                 ORDER BY test_date desc ) as test_date,
    FIRST_VALUE(test_date_from) OVER (PARTITION BY test_id,MONTH(test_date), YEAR(test_date) 
                                      ORDER BY test_date desc ) as test_date_from,
    FIRST_VALUE(cash_per_step) OVER (PARTITION BY test_id,MONTH(test_date), YEAR(test_date) 
                                     ORDER BY test_date desc ) as cash_per_step
FROM YourTable
0 голосов
/ 11 июля 2020
;WITH CTE AS
(
  SELECT *, 
         ROW_NUMBER () OVER (PARTITION BY SUBSTRING(CONVERT(VARCHAR(20),test_date),1,7), 
         test_id ORDER BY TEST_ID,TEST_DATE DESC) RN 
  FROM @table
)
SELECT * FROM CTE WHERE RN =1 ORDER BY TEST_ID
0 голосов
/ 10 июля 2020

Это дает те же результаты, хотя выглядит как basi c код:

declare @table table (test_id int,test_date date,test_date_from date,cash_per_step float)

insert into @table

(test_id,test_date,test_date_from,cash_per_step)
values
    (1,'2020-01-01','2019-12-30',30)
,   (1,'2020-01-21','2019-12-30',40)
,   (1,'2020-02-28','2019-12-30',30)
,   (2,'2020-01-01','2019-12-30',30)
,   (2,'2020-01-21','2019-12-30',40)
,   (2,'2020-02-28','2019-12-30',30);

select
    test_id
,   max(test_date)  test_date
,   test_date_from
,   cash_per_step
from    @table
group by test_id,cash_per_step,test_date_from
order by test_id,test_date

Результаты:

Expected Results

See DEMO

...