Calling a temporary table multiple times (WITH, SELECT)

I have been working on calculating user churn as part of section 6. Analyze real data with SQL.

user churn project

It seems that if I try to called a temporary table multiple times, nothing appears in the output.
For example

WITH months1 AS
(SELECT
  '2017-01-01' as first_day,
  '2017-01-31' as last_day
UNION
SELECT
  '2017-02-01' as first_day,
  '2017-02-28' as last_day
FROM subscriptions
)
SELECT *
FROM months1;
SELECT first_day
FROM months1;

There is no output with those code. If I remove either

SELECT first_day
FROM months1;

or

SELECT *
FROM months1;

then there is an output. Is it only possible to call temporary table once? Is the only way to get both queries to write the following?

WITH months1 AS
(SELECT
  '2017-01-01' as first_day,
  '2017-01-31' as last_day
UNION
SELECT
  '2017-02-01' as first_day,
  '2017-02-28' as last_day
FROM subscriptions
)
SELECT *
FROM months1;
WITH months1 AS
(SELECT
  '2017-01-01' as first_day,
  '2017-01-31' as last_day
UNION
SELECT
  '2017-02-01' as first_day,
  '2017-02-28' as last_day
FROM subscriptions
)
SELECT first_day
FROM months1;

Is the right step to create a view I don’t want to write the same temporary table again and again?
Thanks

the question is really what are you trying to achieve from

WITH months1 AS
(SELECT
  '2017-01-01' as first_day,
  '2017-01-31' as last_day
UNION
SELECT
  '2017-02-01' as first_day,
  '2017-02-28' as last_day
FROM subscriptions
)
SELECT *
FROM months1;
SELECT first_day
FROM months1;

The no output is probably a consequence of the with clause creating the temporary table months1, then the first semicolon after months1 signifies the end of the query (and therefore the scope of the temporary table. Then you run another query but on the (temporary) table but it no longer exists.
If you wanted to keep using it you would need to use some join or union.