Funkcja zwracająca MAX.

0

Cześć, mam bazę danych o następującym wyglądzie.
ID Pomiar
0 3
1 5
2 0
3 0
4 1
5 7
6 10
7 0
8 0
9 0
10 23
11 30
12 21
itd. itd.
Czy jest mozliwosc stworzenia zapytania, które zwróci mi wartość MAX z pierwszej czesci (ID = 0,1), z drugiej cześci(4,5,6), z trzeciej itd.
Czyli miałbym wartości MAX = 5, 10, 30.
Dodam, że ID nie jest sztywne, i moze sie zmieniac.
Pozdrawiam

0

Da się, o ile informacja o "części" też jest w bazie a nie tylko w twojej głowie... Wystarczy zrobić wtedy grupowanie po ID części.

0

Nie ma algorytmu podziału na części. Jest randomowy.
Co rozumiesz przez informacje o części w bazie?

0

Prawdopodobnie chodzi o ekstremum (maksimum) lokalne
O ile ID idą po kolei i przyjmiemy że patrzymy na sąsiednie dwa elementy, wtedy wystarczy

SELECT current.ID, current.Pomiar FROM tabela current LEFT JOIN tabela prev ON prev.ID = a.ID - 1 LEFT JOIN tabela next ON next.ID = a.ID + 1 WHERE current.Pomiar > COALESCE(prev.Pomiar, 0) AND next.Pomiar < COALESCE(current.Pomiar, 0)

nietestowane ale powinno dać w wyniku:

1     5
6     10
11    30
0

@mistiq_secret ale co to są za części? :D Przecież o to się rozbija cały problem. Czemu częścią jest (4,5,6) a nie (4,5,6,7) albo 1-10?

0

przepraszam mała pomyłka, powinno być raczej:

WHERE current.Pomiar > COALESCE(prev.Pomiar, 0) AND COALESCE(next.Pomiar, 0) < current.Pomiar

nadal nietestowane

Jednak z ciekawości przetestowałem

http://sqlfiddle.com/#!9/02b8a/4

0

Tak, jak napisałem. randomowo. są to pomiary siły tensometru. Jest pare cykli w 600 pomiarach (ID)

0
mistiq_secret napisał(a):

Tak, jak napisałem. randomowo. są to pomiary siły tensometru. Jest pare cykli w 600 pomiarach (ID)

musisz zrozumieć że dopóki nie sprecyzujesz w jaki sposób podzieliłeś sobie te pomiary na "części" to nie będzie się tego zaprogramować

najpierw opisz co Tobą kierowało że wybrałeś takie a nie inne ID jako części i krok po kroku opisz jak to zrobić - podział który zaproponowałeś nie jest w żaden sposób logiczny

0

Jednak z ciekawości przetestowałem

http://sqlfiddle.com/#!9/02b8a/4

Przekopiowałem to do siebie. mam sql 2008 management studio.
Error: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'current'.

Podkreśla również słowa prev & next

myśleżejestem napisał(a):
mistiq_secret napisał(a):

Tak, jak napisałem. randomowo. są to pomiary siły tensometru. Jest pare cykli w 600 pomiarach (ID)

musisz zrozumieć że dopóki nie sprecyzujesz w jaki sposób podzieliłeś sobie te pomiary na "części" to nie będzie się tego zaprogramować

najpierw opisz co Tobą kierowało że wybrałeś takie a nie inne ID jako części i krok po kroku opisz jak to zrobić - podział który zaproponowałeś nie jest w żaden sposób logiczny

Bo części nie są logiczne. Mam tensometr ktory wykonuje rozne testy(około 30) i zapisuje wyniki do bazy danych.
To w jaki sposob tabela bedzie podzielona, zalezy od danego testu i pomiarów tensometru

0

Bo części nie są logiczne. Mam tensometr ktory wykonuje rozne testy(około 30) i zapisuje wyniki do bazy danych.
To w jaki sposob tabela bedzie podzielona, zalezy od danego testu i pomiarów tensometru

czyli kompletnie nie pamiętasz dlaczego napisałeś:

z pierwszej czesci (ID = 0,1), z drugiej cześci(4,5,6), z trzeciej itd.
Czyli miałbym wartości MAX = 5, 10, 30.

po prostu te liczby pojawiły się w Twojej głowie, tak?

0
myśleżejestem napisał(a):

Bo części nie są logiczne. Mam tensometr ktory wykonuje rozne testy(około 30) i zapisuje wyniki do bazy danych.
To w jaki sposob tabela bedzie podzielona, zalezy od danego testu i pomiarów tensometru

czyli kompletnie nie pamiętasz dlaczego napisałeś:

z pierwszej czesci (ID = 0,1), z drugiej cześci(4,5,6), z trzeciej itd.
Czyli miałbym wartości MAX = 5, 10, 30.

po prostu te liczby pojawiły się w Twojej głowie, tak?

Dokładnie tak.
Byłem ciekawy, czy istnieje schemat odnalezienia wartości maksymalnej danej części, odzielonej od innej części 0, i tak z każdą częścią.

0

@mistiq_secret ale co miałoby być wynikiem? o_O Bo ja zupełnie nie rozumiem jaki jest sens tego co chcesz zrobić. To nie jest problem wygenerować sobie MAX dla każdego podzbioru z twoich danych, ale takich podzbiorów będzie 2n gdzie n to liczba pomiarów. Dla twoich 13 pomiarów wszystkich możliwych "części" będzie 8192.

edit: odzielonej od innej części 0 WTF? Uważasz że nie warto było o tym wspomnieć? o_O

0
mistiq_secret napisał(a):

wartości maksymalnej danej części, odzielonej od innej części 0, i tak z każdą częścią.

no i o to nam chodziło!

Czyli "części" oddzielone są od siebie zerem

niestety nie mam pomysłu na przyzwoite zapytanie realizującą takie coś, ale pomyślę

moje poprzednie zadziała jeśli zmienisz "current" i "next" na coś innego bo to słowa zarezerwowane w mssql ale policzy to w nieco inny sposób

1

wymyśliłem coś takiego, ale to tragedia

WITH parts AS
(
SELECT ROW_NUMBER() OVER (ORDER BY a.Id) PartId, a.Id rfrom, MIN(nn.Id) rto FROM test a
LEFT JOIN test pp ON pp.Id = a.Id - 1
LEFT JOIN test nn ON nn.Id >= a.Id AND nn.Pomiar != 0
WHERE a.pomiar != 0 AND ISNULL(pp.pomiar, 0) = 0 AND ISNULL((SELECT Pomiar FROM test z WHERE z.Id = nn.Id + 1), 0) = 0
GROUP BY a.Id
)
SELECT MAX(Pomiar) FROM test c
JOIN parts ON parts.rfrom <= c.Id AND parts.rto >= c.Id
GROUP BY PartId

robi dokładnie to co chciałeś (max z części oddzielonych zerami)
dla małej ilości danych może być ok, ale będzie wolne dla większej ilości danych (SELECT w WHERE, ROW_NUMBER, dwa grupowania)

0

Cześć Jest, super. wielkie dzięki za poświęcony czas.
Jeszcze jedno pytanie, gdzie mógłbym wsadzić tam jeszcze jedno WHERE, ktore bedzie odpowiadalo konkretnej dacie.
Czyli zapytanie będzie wykonywało się tylko dla zdefiniowanej daty, np. 01.01.2015, ofc. jesli jest taka mozliwosc.
ID Pomiar Data
0 3 01.01.2015
1 5 01.01.2015
2 0 01.01.2015
3 0 01.01.2015
4 1 01.01.2015
5 7 01.01.2015
6 10 02.01.2015
7 0 02.01.2015
8 0 02.01.2015
9 0 02.01.2015
10 23 02.01.2015
11 30 02.01.2015
12 21 02.01.2015

0

any idea?

1

żeby działało identycznie trzeba by było to dorzucić w kilku miejscach, łatwiej przefiltrować dane na wstępie

with filtered as
(select * from test where data = '01.01.2015')
... (tutaj reszta zapytania)

i zamienić wszędzie test na filtered
gwiazdkę możesz zamienić na wypisanie potrzebnych kolumn jeśli może być ich więcej

1 użytkowników online, w tym zalogowanych: 0, gości: 1