Повторите строки определенное количество раз для столбцов

#sql #postgresql

Вопрос:

У меня есть этот стол:

 select * from db_table

car            city                  month_number
Honda          Boston                    1
Honda          Boston                    2
Honda          Boston                    3
Honda          Boston                    4
Honda          Boston                    5    <---data ends for Honda and Boston
Toyota         Chicago                   1
Toyota         Chicago                   2
Toyota         Chicago                   3
Toyota         Chicago                   4
Toyota         Chicago                   5
Toyota         Chicago                   6   <---data ends for Toyota and Chicago
 

Я хочу иметь возможность самостоятельно генерировать данные для каждого car цикла и city , скорее, для 24-месячного цикла auto-increment .

То, что я ищу:

 car            city                  month_number
Honda          Boston                    1
Honda          Boston                    2
Honda          Boston                    3
Honda          Boston                    4
Honda          Boston                    5
Honda          Boston                    6
Honda          Boston                    7
Honda          Boston                    8
Honda          Boston                    9
Honda          Boston                    10
Honda          Boston                    11
Honda          Boston                    12
Honda          Boston                    13
Honda          Boston                    14
Honda          Boston                    15
Honda          Boston                    16
Honda          Boston                    17
Honda          Boston                    18
Honda          Boston                    19
Honda          Boston                    20
Honda          Boston                    21
Honda          Boston                    22
Honda          Boston                    23
Honda          Boston                    24
Toyota         Chicago                   1
Toyota         Chicago                   2
Toyota         Chicago                   3
Toyota         Chicago                   4
Toyota         Chicago                   5
Toyota         Chicago                   6
Toyota         Chicago                   7
Toyota         Chicago                   8
Toyota         Chicago                   9
Toyota         Chicago                   10
Toyota         Chicago                   11
Toyota         Chicago                   12
Toyota         Chicago                   13
Toyota         Chicago                   14
Toyota         Chicago                   15
Toyota         Chicago                   16
Toyota         Chicago                   17
Toyota         Chicago                   18
Toyota         Chicago                   19
Toyota         Chicago                   20
Toyota         Chicago                   21
Toyota         Chicago                   22
Toyota         Chicago                   23
Toyota         Chicago                   24
 

Как я могу сделать это в PostgreSQL?

Ответ №1:

Вы можете попробовать использовать generate_series с CROSS JOIN подзапросом.

Запрос 1:

 SELECT t1.car,
       t1.city,
       month_number
FROM generate_series(1, 24) month_number CROSS JOIN (
   select DISTINCT car,
          city  
  from db_table
) t1
ORDER BY t1.car,t1.city 
 

Результаты:

 |    car |    city | month_number |
|--------|---------|--------------|
|  Honda |  Boston |            1 |
|  Honda |  Boston |            2 |
|  Honda |  Boston |            3 |
|  Honda |  Boston |            4 |
|  Honda |  Boston |            5 |
|  Honda |  Boston |            6 |
|  Honda |  Boston |            7 |
|  Honda |  Boston |            8 |
|  Honda |  Boston |            9 |
|  Honda |  Boston |           10 |
|  Honda |  Boston |           11 |
|  Honda |  Boston |           12 |
|  Honda |  Boston |           13 |
|  Honda |  Boston |           14 |
|  Honda |  Boston |           15 |
|  Honda |  Boston |           16 |
|  Honda |  Boston |           17 |
|  Honda |  Boston |           18 |
|  Honda |  Boston |           19 |
|  Honda |  Boston |           20 |
|  Honda |  Boston |           21 |
|  Honda |  Boston |           22 |
|  Honda |  Boston |           23 |
|  Honda |  Boston |           24 |
| Toyota | Chicago |            1 |
| Toyota | Chicago |            2 |
| Toyota | Chicago |            3 |
| Toyota | Chicago |            4 |
| Toyota | Chicago |            5 |
| Toyota | Chicago |            6 |
| Toyota | Chicago |            7 |
| Toyota | Chicago |            8 |
| Toyota | Chicago |            9 |
| Toyota | Chicago |           10 |
| Toyota | Chicago |           11 |
| Toyota | Chicago |           12 |
| Toyota | Chicago |           13 |
| Toyota | Chicago |           14 |
| Toyota | Chicago |           15 |
| Toyota | Chicago |           16 |
| Toyota | Chicago |           17 |
| Toyota | Chicago |           18 |
| Toyota | Chicago |           19 |
| Toyota | Chicago |           20 |
| Toyota | Chicago |           21 |
| Toyota | Chicago |           22 |
| Toyota | Chicago |           23 |
| Toyota | Chicago |           24 |
 

Комментарии:

1. спасибо, если так случится, что в эту таблицу будет добавлено больше столбцов, будет ли этот же запрос работать и с добавленными столбцами? например purchase_date , добавлен столбец?

2. Да, вы можете попробовать это