poniedziałek, 3 września 2018

Pomiar czasu - przygotowanie danych

Chwilę (dzień lub dwa) się zastanawiałem jak z 16-stu kolumn zrobić dwie kolumny z wieloma wierszami. Myślałem o Pivocie, ale po wstępnej analizie zrezygnowałem uznając ze w moim przypadku się to nie sprawdzi.
Wpadłem na nie co inny pomysł:
Tabela źródłowa liczy sobie 254 rekordy i 16 kolumn
  • pierwsza to czas_id PK - int
  • kolejne to czas_1, czas_2 ....itd - datetime
Postanowiłem że poprzez CTE zrobię Uniona i inserta do nowej tabeli poszło gładko tylko kod nie co mniej czytelny
 

with cz1 as
(select czas_id,czas_1 from czas),
cz2 as
(select czas_id,czas_2 from czas),
cz3 as
(select czas_id,czas_3 from czas),
cz4 as
(select czas_id,czas_4 from czas),
cz5 as
(select czas_id,czas_5 from czas),
cz6 as
(select czas_id,czas_6 from czas),
cz7 as
(select czas_id,czas_7 from czas),
cz8 as
(select czas_id,czas_8 from czas),
cz9 as
(select czas_id,czas_9 from czas),
cz10 as
(select czas_id,czas_10 from czas),
cz11 as
(select czas_id,czas_11 from czas),
cz12 as
(select czas_id,czas_12 from czas),
cz13 as
(select czas_id,czas_13 from czas),
cz14 as
(select czas_id,czas_14 from czas),
cz15 as
(select czas_id,czas_15 from czas),
unionTable as
(
select * from cz1
union
select * from cz2
union
select * from cz3
union
select * from cz4
union
select * from cz5
union
select * from cz6
union
select * from cz7
union
select * from cz8
union
select * from cz9
union
select * from cz10
union
select * from cz11
union
select * from cz12
union
select * from cz13
union
select * from cz14
union
select * from cz15
)
SELECT *
INTO czas_OneColumn
FROM unionTable

Zapewne istnieje łatwiejszy sposób albo mniej pogmatwany ale na tę chwilę go nie znam.
Mając dane testowe można przejść do tworzenia algorytmu.
Tabele w oryginalnej bazie były tworzone w ten sposób że tabela czas i zawodnik były połączone relacją wiele do wielu poprzez tabele łączącą.
Z reguły było tak że czas_id odpowiadał zaw_id (tabela zawodnik). Idąc tym tropem w moich rozważaniach czas_id będzie również traktowany jako zawodnik. 

Uwaga
Zamiast Union można zastosować Union All tyle że w drugim przypadku trzeb się przygotować na dużą ilość duplikatów.

W moim przypadku przy użyciu union mam 1243 rekordy z czego 251 ma wartość null w kolumnie czas_1
Union All to ilość 3810 rekordów z czego 2818 to null-e
Do tej pory wartości null były dopuszczane w tabeli z czasami, gdyż każdy zawodnik ma 15 kolumn z czasami ale nie wszyscy jadą na maksymalną odległość.
W nowej wersji każdy zawodnik będzie miał tylko taką ilość wierszy jaka zostanie dodana przy pomiarze czasu na czytniku.

cdn...
 

Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...