Ето моя опростен код:
SELECT
a.user_id as User_ID,
min(b.a_day) as Date_from,
max(b.a_day) as Date_to,
c.code as ID
FROM a, b, c
WHERE
a_day > (day, -15, getdate())
GROUP BY
a.user_id,
c.code
Заявката дава следния изход:
User ID date_from date_to id
1234567 2016-06-13 2016-06-13 B
1234567 2016-06-17 2016-06-17 A
12345672016-06-18 2016-06-18 A
1234567 2016-06-19 2016-06-19 A
1234567 2016-06-20 2016-06-20 A
1234567 2016-06-21 2016-06-21 C
1234567 2016-06-22 2016-06-22 C
1234567 2016-06-23 2016-06-23 D
Трябва ми нещо подобно:
User ID date_from date_to id
1234567 2016-06-13 2016-06-13 B
1234567 2016-06-17 2016-06-20 A
1234567 2016-06-21 2016-06-22 C
1234567 2016-06-23 2016-06-23 D
Когато използвам функцията min () и max () с група от, тя събира глоба за всички записи, но трябва да събирам само дати с един и същи идентификатор ден след ден.
Някакви идеи?
Благодаря предварително.
Отговори:
4 за отговор № 1Можете да го направите с условно групиране, като използвате CASE EXPRESSION
в GROUP BY
клауза :
SELECT
a.user_id as User_ID,
min(b.a_day) as Date_from,
max(b.a_day) as Date_to,
c.code as ID
FROM a, b, c
WHERE
a_day > (day, -15, getdate())
GROUP BY
a.user_id,
c.code,
CASE WHEN c.code in ("B","D") THEN b.a_day ELSE 1 END
Което ще генерира това като GROUP BY
клауза :
c.code = "B" -> a.user_id,c.code,b.a_day
c.code <> "B" -> a.user_id,c.code,1