Funkcje analityczne - data wprowadzenia wartości

Funkcje analityczne - data wprowadzenia wartości
G1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:48
0

Mam do rozwiązania problem. Postaram się go opisać możliwie dokładnie, ale nie wiem czy mi się uda, gdyż sam nie wiem o co dokładnie chodzi :( Mianowicie:

Tabela zawiera klientów. klient opisany jest przez jakieś ID. Klient może zmieniać swoją aktywność (nie ważne z jakiej na jaką), a każda zmiana aktywności jest opisana poprzez START_DTE oraz END_DTE. W pewnym momencie klient umiera i podana jest data kiedy zmarł (ale aktywności mogą się zmieniać nawet po jego śmierci). W tabeli bedzie to wygladalo mniej wiecej tak:

ID START_DTE END_DTE ZGON
ID1 1-01-2009 1-08-2009 null
ID1 2-08-2009 10-10-2009 null
ID1 11-10-2009 4-12-2009 null
ID1 5-12-2013 2-02-2014 1-12-2013
ID1 3-02-2014 30-11-2014 1-12-2013
ID1 1-12-2014 null 1-12-2013

Moim zadaniem jest znaleźć DATĘ WPROWADZENIA daty zgonu do tabeli (nie datę zgonu, tylko datę jej wprowadzenia). Czyli patrząc na tabele powyżej, jeśli wartość w polu ZGON pojawia się po raz pierwszy, tzn, że START_DTE w tym wierszu to właśnie data wprowadzenia daty zgonu do tabeli.

Początkowo zrobiłem to tak, że odfiltrowałem

Kopiuj
WHERE ZGON IS NOT NULL

i wybrałem MIN(START_DTE) AS DATA_WPROWADZENIA

Kopiuj
, ale ta metoda jest zbyt prosta i muszę skorzystać z czegos bardziej wyszukanego, żeby się nauczyć. Dostałem wskazówki żeby zastosować funkcje analityczne OVER PRECEDING FOLLOWING, ale średnio widzę jak można by to zrobić tą metodą. Podobno można jeszcze JOINem ale tu już w ogóle nie mam pomysłu. 

Jeśli chodzi o sposób pierwszy, to wymyśliłem jedynie coś takiego: zastosować funkcję PRECEDING, która doda mi jedną kolumnę z przesunięciem daty zgonu w dół. Wtedy w wierszu z moją datą wprowadzenia powstanie różnica i dodając warunek
```sql
 WHERE PRZESUNIECIE <> ZGON

wcyiągnę tylko ten jedyny wiersz który mnie interesuje (tabela poniżej). Niestety Kolumny utworzonej w wyniku funkcji analitycznej nie moge używać w warunku WHERE, a wrzucenie całego zapytania do podzapytania lub CTE wymieszało mi wszystkie wartości (nie mam pojęcia dlaczego).

ID</th> START_DTE</th> END_DTE</th> ZGON</th> PRZESUNIECIE</th> </tr> </thead> ID1</td> 1-01-2009</td> 1-08-2009</td> null</td> null</td> </tr> ID1</td> 2-08-2009</td> 10-10-2009</td> null</td> null</td> </tr> ID1</td> 11-10-2009</td> 4-12-2009</td> null</td> null</td> </tr> ID1</td> 5-12-2013</td> 2-02-2014</td> 1-12-2013</td> null</td> </tr> ID1</td> 3-02-2014</td> 30-11-2014</td> 1-12-2013</td> 1-12-2013</td> </tr> ID1</td> 1-12-2014</td> null</td> 1-12-2013</td> 1-12-2013</td> </tr> </tbody> </table>

Być może moje wnioskowanie dotyczące zastosowania funkcji analitycznej jest błędne, więc proszę o wskazówki jak rozwiązać problem. Ewentualnie jak to zrobić JOINem.

Pozdrawiam!

edytowany 1x, ostatnio: gruby19
M8
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 5 lat
  • Postów:152
0

Nie wiem do końca co dla Twojego przełożonego/nauczyciela znaczy za proste bo według mnie najprostsze działające rozwiązanie jest najlepsze.
Jeżeli chodzi o Joina:

Kopiuj
use SampleDB
go
with forum4programmers as (
Select t1.id, t1.start_dte 
from dbo.table1 as t1
inner join
dbo.table1 as t2
on t1.id=t2.Id and t1.zgon is not null
)
Select id, min(start_dte) as "I believe I can fly"
from forum4programmers
group by id

Mógłbyś użyć też filtra where zamiast warunku "on" ale w przypadku inner joina to to samo.

Jeżeli chodzi o funkcje okna to np.:

Kopiuj

use SampleDB
go
with forum4programmers as (
select id, start_dte, lag(zgon,1,0) over(partition by id order by start_dte) as whatever
from table1
)
Select id,max(start_dte) as "whatsoever"
from forum4programmers
where whatever is null
group by id

Jakby znowu Ci powiedzieli, że za proste to pisz ;-)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)