Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Rozbicie danych z kolumny

Witam,
Mam tabele jak ponizej
Identyfikator Pracownik Nazwa Wydzialu Data zdarzenia Godzina REJESTRACJI
3065 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 06:00:00.000
3066 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3067 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3068 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 15:00:00.000
3069 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3070 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 13:00:00.000
3071 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3072 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 16:00:00.000

i teraz moj problem polega na tym ze musze rozbic czas REJESTRACJI wg. wytycznych
pierwszy czas REJESTRACJI danego dnia fo czas wejscia drugi czas tego dnia to czas wyjscia trzeci czas to czas wejscia , czwarty czas to czas wyjscia.
Chce kolumne czas rejestracji rozbic na kolumne czasu wejscia i kolumne czasu wyjscia.
Czy ktos moglby pomoc jak to zrobic?
Jeszcze jeden problem, czesto np czas rejestracji ma np 3 wpisy w odstepach 3, 5 sekund spowodowane kilkakrotnym przylozeniem karty do czytnika i istotny powinien pozostac tylko ten pierwszy czas ( dwa pozostale do usuniecia ).
Za pomoc z gory dziekuje

konto usunięte

Temat: Rozbicie danych z kolumny

To ja w punktach:

1 - jeśli to prawdziwe dane, to raczej proponowałbym ich nie upubliczniać

2 - jakaż to baza danych i w jakiej wersji?
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Rozbicie danych z kolumny

to SQL server 2008R2 standard
Adam O.

Adam O. Bazy danych etc

Temat: Rozbicie danych z kolumny

Krzysztof S.:
Witam,
Mam tabele jak ponizej
Identyfikator Pracownik Nazwa Wydzialu Data zdarzenia Godzina REJESTRACJI
3065 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 06:00:00.000
3066 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3067 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3068 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 15:00:00.000
3069 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3070 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 13:00:00.000
3071 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3072 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 16:00:00.000

i teraz moj problem polega na tym ze musze rozbic czas REJESTRACJI wg. wytycznych
pierwszy czas REJESTRACJI danego dnia fo czas wejscia drugi czas tego dnia to czas wyjscia trzeci czas to czas wejscia , czwarty czas to czas wyjscia.
Chce kolumne czas rejestracji rozbic na kolumne czasu wejscia i kolumne czasu wyjscia.
Czy ktos moglby pomoc jak to zrobic?
Jeszcze jeden problem, czesto np czas rejestracji ma np 3 wpisy w odstepach 3, 5 sekund spowodowane kilkakrotnym przylozeniem karty do czytnika i istotny powinien pozostac tylko ten pierwszy czas ( dwa pozostale do usuniecia ).
Za pomoc z gory dziekuje

Z datami w odstępie 3-5 sekund nie pomogę bo to trochę więcej zachodu, a poza tym biznesowo trzeba by się zastanowić "a co jeżeli pracownik chciał wyjść ale się rozmyślił i wrócił w ciągu 5 sekund? Która sytuacja jest częstsza? Czy jesteśmy w stanie wykrywać który to przypadek?". Ale zakładając że CTETOP podmienisz sobie na nazwę swojej tabeli, i wywalisz pierwsze CTE, to:

;WITH CTETOP AS(
SELECT
3065 as Identyfikator, 'Rzadkowolski Wojciech' as Pracownik, 'Wydział TJ' as NWydzialu, '2014-01-02' as Data, '2014-01-02 06:00:00.000' as GodzinaR
UNION ALL
SELECT
3066, 'Rzadkowolski Wojciech', 'Wydział TJ', '2014-01-02', '2014-01-02 14:00:00.000'
UNION ALL
SELECT
3067, 'Prątnicki Wiesław', 'Wydział TJ', '2014-01-02', '2014-01-02 07:00:00.000'
UNION ALL
SELECT
3068, 'Prątnicki Wiesław', 'Wydział TJ', '2014-01-02', '2014-01-02 15:00:00.000'
UNION ALL
SELECT
3069, 'Wierzbicki Krzysztof', 'Wydział TJ', '2014-01-02', '2014-01-02 07:00:00.000'
UNION ALL
SELECT
3070, 'Wierzbicki Krzysztof', 'Wydział TJ', '2014-01-02', '2014-01-02 13:00:00.000'
UNION ALL
SELECT
3071, 'Wierzbicki Krzysztof', 'Wydział TJ', '2014-01-02', '2014-01-02 14:00:00.000'
UNION ALL
SELECT
3072, 'Wierzbicki Krzysztof', 'Wydział TJ', '2014-01-02', '2014-01-02 16:00:00.000'
), CTEBOTTOM AS
(SELECT Pracownik, dense_rank() over (partition by Pracownik order by GodzinaR) as ranking FROM CTETOP)
select Pracownik, (case when RANKING%2 = 1 then 'wejscie' else 'wyjscie' end) as Akcja from CTEBOTTOM;

konto usunięte

Temat: Rozbicie danych z kolumny

Krzysztof S.:
Witam,
Mam tabele jak ponizej
Identyfikator Pracownik Nazwa Wydzialu Data zdarzenia Godzina REJESTRACJI
3065 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 06:00:00.000
3066 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3067 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3068 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 15:00:00.000
3069 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3070 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 13:00:00.000
3071 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3072 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 16:00:00.000

i teraz moj problem polega na tym ze musze rozbic czas REJESTRACJI wg. wytycznych
pierwszy czas REJESTRACJI danego dnia fo czas wejscia drugi czas tego dnia to czas wyjscia trzeci czas to czas wejscia , czwarty czas to czas wyjscia.
Chce kolumne czas rejestracji rozbic na kolumne czasu wejscia i kolumne czasu wyjscia.
Czy ktos moglby pomoc jak to zrobic?
Jeszcze jeden problem, czesto np czas rejestracji ma np 3 wpisy w odstepach 3, 5 sekund spowodowane kilkakrotnym przylozeniem karty do czytnika i istotny powinien pozostac tylko ten pierwszy czas ( dwa pozostale do usuniecia ).
Za pomoc z gory dziekuje

Zadanie wydaje się proste (chociaż rozwiązanie może być nieoptymalne).

Tworzysz dwie funkcje -

1. CzasWejscia(@Pracownik, @NazwaWydzialu,@DataZdarzenia) - zwraca najwcześniejsza "godzinę zdarzenia" dla zadanych "Data zdarzenia", "Pracownik" etc ..

2. Analogicznie - CzasWyjscia

3. Uruchamiasz zapytanie: SELECT DISTINCT Pracownik, NazwaWydzialu, DataZdarzenia, CzasWejscia(Pracownik, NazwaWydzialu, DataZdarzenia), CzasWyjscia(Pracownik, NAzwaWydzilu...) FROM Tabela

Jszcze prostsza metoda - robisz group by po pracowniku, wydziale i dacie zdarzenia a następnie w zapytaniu wołasz MIN (DataZdarzenia) as CzasWejscia, MAX (DataZdarzenia) as CzasWyjsciaTen post został edytowany przez Autora dnia 05.08.14 o godzinie 10:42

konto usunięte

Temat: Rozbicie danych z kolumny

Jakub W.:
Krzysztof S.:
Witam,
Mam tabele jak ponizej
Identyfikator Pracownik Nazwa Wydzialu Data zdarzenia Godzina REJESTRACJI
3065 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 06:00:00.000
3066 Rzadkowolski Wojciech Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3067 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3068 Prątnicki Wiesław Wydział TJ 2014-01-02 2014-01-02 15:00:00.000
3069 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 07:00:00.000
3070 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 13:00:00.000
3071 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 14:00:00.000
3072 Wierzbicki Krzysztof Wydział TJ 2014-01-02 2014-01-02 16:00:00.000

i teraz moj problem polega na tym ze musze rozbic czas REJESTRACJI wg. wytycznych
pierwszy czas REJESTRACJI danego dnia fo czas wejscia drugi czas tego dnia to czas wyjscia trzeci czas to czas wejscia , czwarty czas to czas wyjscia.
Chce kolumne czas rejestracji rozbic na kolumne czasu wejscia i kolumne czasu wyjscia.
Czy ktos moglby pomoc jak to zrobic?
Jeszcze jeden problem, czesto np czas rejestracji ma np 3 wpisy w odstepach 3, 5 sekund spowodowane kilkakrotnym przylozeniem karty do czytnika i istotny powinien pozostac tylko ten pierwszy czas ( dwa pozostale do usuniecia ).
Za pomoc z gory dziekuje

Zadanie wydaje się proste (chociaż rozwiązanie może być nieoptymalne).

Tworzysz dwie funkcje -

1. CzasWejscia(@Pracownik, @NazwaWydzialu,@DataZdarzenia) - zwraca najwcześniejsza "godzinę zdarzenia" dla zadanych "Data zdarzenia", "Pracownik" etc ..

2. Analogicznie - CzasWyjscia

3. Uruchamiasz zapytanie: SELECT DISTINCT Pracownik, NazwaWydzialu, DataZdarzenia, CzasWejscia(Pracownik, NazwaWydzialu, DataZdarzenia), CzasWyjscia(Pracownik, NAzwaWydzilu...) FROM Tabela

Jszcze prostsza metoda - robisz group by po pracowniku, wydziale i dacie zdarzenia a następnie w zapytaniu wołasz MIN (DataZdarzenia) as CzasWejscia, MAX (DataZdarzenia) as CzasWyjscia

W ten sposób pracownik przychodzący o 8 rano i wychodzący 8:15, który wrócił o 16 i wyszedł 16:01, będzie w pracy od 8 do 16:01... i chyba nie o to chodzi.
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Rozbicie danych z kolumny

Rozwiazanie problemu:

SELECT Identyfikator
,Pracownik
,[Nazwa Wydzialu]
,[Data zdarzenia]
,[Data wejscia]
,[Data wyjscia]
FROM
(
SELECT t1.Identyfikator
,t1.Pracownik
,t1.[Nazwa Wydzialu]
,t1.[Data zdarzenia]
,t1.[Data wejscia]
,t2.[Data wyjscia]
,ROW_NUMBER() OVER (PARTITION BY t1.Pracownik, t1.[Nazwa Wydzialu], t1.[Data zdarzenia] ORDER BY Identyfikator) RN
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY Pracownik, [Nazwa Wydzialu], [Data zdarzenia] ORDER BY Identyfikator) AS RN
,Identyfikator
,Pracownik
,[Nazwa Wydzialu]
,[Data zdarzenia]
,[Godzina REJESTRACJI] AS [Data wejscia]
FROM #tmpTable
)t1
LEFT OUTER JOIN
(
SELECT ROW_NUMBER() OVER(PARTITION BY Pracownik, [Nazwa Wydzialu], [Data zdarzenia] ORDER BY Identyfikator) AS RN
,Pracownik
,[Nazwa Wydzialu]
,[Data zdarzenia]
,[Godzina REJESTRACJI] AS [Data wyjscia]
FROM #tmpTable
)t2
ON t1.Pracownik = t2.Pracownik
AND t1.[Nazwa Wydzialu] = t2.[Nazwa Wydzialu]
AND t1.[Data zdarzenia] = t2.[Data zdarzenia]
AND t1.RN + 1 = t2.RN
WHERE t2.Pracownik IS NOT NULL
AND DATEDIFF(S, T1.[Data wejscia], T2.[Data wyjscia]) > 3.5
) tbl
WHERE tbl.RN % 2 = 1

rozwiewa wszelkie watpliwosci.

konto usunięte

Temat: Rozbicie danych z kolumny

Szymon G.:

W ten sposób pracownik przychodzący o 8 rano i wychodzący 8:15, który wrócił o 16 i wyszedł 16:01, będzie w pracy od 8 do 16:01... i chyba nie o to chodzi.

Rzeczywiście tego nie wziąłem pod uwagę.
W takim razie zostaje albo procedura albo "kombinowanie". :)

Następna dyskusja:

[postgreSQL] Dynamiczna naz...




Wyślij zaproszenie do