I have this requirement to find records for people but only include the first during any 31-day period.
If a person has more than one record in a 31-day period, include only the first record. For example, if a person has a record on January 1, include the January 1 record and do not include records that occur on or between January 2 and January 31; then, if applicable, include the next record that occurs on or after February 1. Identify visits chronologically, including only one per 31-day period.
I've tried a variety of methods to try to make this work with NOT EXISTS, ROW NUMBER, RANK and loops but haven't been able to make it work right.
Here's how it should group the records:
| PERSON | RECORD_DATE | RECORD_GROUP |
|---|---|---|
| JACK | 2021-01-02 | 1 |
| JACK | 2021-01-21 | 1 |
| JACK | 2021-01-25 | 1 |
| JACK | 2021-02-01 | 1 |
| JACK | 2021-02-04 | 2 |
| JACK | 2021-02-21 | 2 |
| JACK | 2021-03-01 | 2 |
| JACK | 2021-03-12 | 3 |
| JACK | 2021-03-30 | 3 |
| JACK | 2021-04-10 | 3 |
| JACK | 2021-04-16 | 4 |
| JILL | 2021-01-20 | 1 |
| JILL | 2021-01-22 | 1 |
| JILL | 2021-01-26 | 1 |
| JILL | 2021-02-18 | 1 |
| JILL | 2021-02-23 | 2 |
| JILL | 2021-02-28 | 2 |
| JILL | 2021-03-08 | 2 |
| JILL | 2021-03-26 | 3 |
| JILL | 2021-03-30 | 3 |
| JILL | 2021-04-20 | 3 |
| JILL | 2021-04-30 | 4 |
Here's some sample data:
SELECT 'JACK' AS PERSON, '2021-01-02' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP
INTO #TEMP UNION
SELECT 'JACK' AS PERSON, '2021-01-21' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-01-25' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-02-01' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-02-04' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-02-21' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-03-01' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-03-12' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-03-30' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-04-10' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JACK' AS PERSON, '2021-04-16' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-01-20' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-01-22' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-01-26' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-02-18' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-02-23' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-02-28' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-03-08' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-03-26' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-03-30' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-04-20' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP UNION
SELECT 'JILL' AS PERSON, '2021-04-30' AS RECORD_DATE, CAST(NULL AS SMALLINT) AS RECORD_GROUP
Any suggestions will be appreciated.