Используйте Recursive CTE в SQL Server для получения данных для всех идентификаторов - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь использовать Recursive CTE в sql, чтобы получить данные для каждого уникального идентификатора в таблице. Я читаю этот учебник , но не могу заставить мой код работать.

Мой логин c -

for each unique id in a table = currentId
select * from table
where 
date between
max available date of that currentId
and 
5 days before that max available date of that currentId

Я пытался сделать это

WITH cte_org AS (
    SELECT * FROM shoes 
    UNION ALL
    SELECT * 
    FROM cte_org 
    WHERE  
    CAST(startTime AS date) 
    BETWEEN  DATEADD(DAY,-30, (select max(CAST(startTime as date)) from shoes where shoeId = cte_org.shoeId )  )
    AND (select max(CAST(startTime as date)) from shoes where shoeId = cte_org.shoeId )
)

 SELECT * FROM cte_org

Я получаю

SQL Ошибка 467 GROUP BY, HAVING или агрегатные функции недопустимы в рекурсивной части рекурсивного общего табличного выражения 'cte_org'

Любая помощь?

EDIT

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

for shoe id 1
time 14/1/2020 - color black
time 13/1/2020 - color yellow
time 12/1/2020 - color pink
time 11/1/2020 - color orange
time 10/1/2020 - color green

for shoe id 2
time 14/1/2020 - color white
time 13/1/2020 - color green
time 12/1/2020 - color black
time 11/1/2020 - color blue
time 10/1/2020 - color brown

for shoe id 3....etc

РЕДАКТИРОВАТЬ 2

id   time          color
1    14/1/2020     pink
2    14/1/2020     black
3    14/1/2020     orange

1 Ответ

0 голосов
/ 14 января 2020
    WITH cte_org AS (
        SELECT * FROM shoes 
        UNION ALL
        SELECT * 
        FROM cte_org 
        WHERE  
        CAST(startTime AS date) 
        BETWEEN  DATEADD(DAY,-30, (select max(CAST(startTime as date)) from shoes where shoeId = cte_org.shoeId )  )
        AND (Select top 1 CAST(startTime as date) 
 from shoes where shoeId = cte_org.shoeId 
Order by startTime desc)
    )

 SELECT * FROM cte_org

ИЛИ

    WITH cte_org AS (
        SELECT * FROM shoes 
        UNION ALL
        SELECT * 
        FROM cte_org 
        WHERE  
        CAST(startTime AS date) 
        BETWEEN  DATEADD(DAY,-30, (select max(CAST(startTime as date)) from shoes where shoeId = cte_org.shoeId )  )
        AND (Select Max(CAST(startTime as date)) OVER ( Partition by shoeId) AS max_date
 from shoes where shoeId = cte_org.shoeId )
    )

 SELECT * FROM cte_org

Пожалуйста, попробуйте запросы выше, если есть какая-либо синтаксическая ошибка, попробуйте исправить ее, но это верный лог c ..

...