Using the GroupBy node alone won’t result in your desired output since grouping on “id” and “attribute” will aggregate all values of the same group so there would be no such a row like the third row in your desired output example.
To overcome this issue, you have to create a grouping column based on the chain of attributes. So you can use the Lag Column node on “attribute” and filter rows where the value changes and assign a group ID (e.g. by using the Counter Generation node), the by using the Cell Replacer node, you can add the values to the main table and fill the other rows using the Missing Value node (in this case, using the previous value to fill the missing rows). Also you have to convert the date column from String to Date in the standard format, otherwise the min and max will not work properly.
Now the table is ready to be passed to the GroupBy node, grouping on the new group ID column (and if you like to keep id and attribute, add them as well) and using the min and max on the date column as @izaychik63 has suggested.
Here is an example workflow to check how this works: date_range.knwf (42.5 KB)
following Lag Column node from @armingrudd example you can use Rule Engine node to get group id using following syntax: NOT $attribute$ = $attribute(-1)$ => $$ROWINDEX$$
Then immediately Missing Value can be applied as is.