SQL FIDDLE
I have the following database table:
| date | name |
|---|---|
| 2014-08-10 | bob |
| 2014-08-10 | sue |
| 2014-08-11 | bob |
| 2014-08-11 | mike |
| 2014-08-12 | bob |
| 2014-08-12 | mike |
| 2014-08-05 | bob |
| 2014-08-06 | bob |
SELECT t.Name,COUNT(*) as frequency
FROM (
SELECT Name,Date,
row_number() OVER (
ORDER BY Date
) - row_number() OVER (
PARTITION BY Name ORDER BY Date
) + 1 seq
FROM orders
) t
GROUP BY Name,seq;
Tried running the Tabibitosan method of finding gaps and islands produces the below table which is incorrect. The name "mike" should actually have a count of 2 since the 11th and 12th days are consecutive. How do I fix this?
| name | frequency |
|---|---|
| mike | 1 |
| bob | 3 |
| bob | 2 |
| mike | 1 |
| sue | 1 |
Correct expected output below:
| name | frequency |
|---|---|
| bob | 3 |
| bob | 2 |
| mike | 2 |
| sue | 1 |
You are using the wrong logic. Basically, you want dates that are sequential, so you want to subtract the sequence from the date:
SELECT t.Name, COUNT(*) as frequency
FROM (SELECT o.*,
row_number() OVER (PARTITION BY Name ORDER BY Date) as seqnum
FROM orders o
) t
GROUP BY Name, date - seqnum * interval '1 day';
Here is a db<>fiddle.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With