2 Stimmen

SQL-Abfrage: Auswahl des letzten Datensatzes, bei dem ein Wert unter einen Schwellenwert fiel

Angesichts dieses Beispieldatensatzes:

-----------------------------
| item   | date       | val |
-----------------------------
| apple  | 2012-01-11 |  15 |
| apple  | 2012-02-12 |  19 |
| apple  | 2012-03-13 |   7 |
| apple  | 2012-04-14 |   6 |
| orange | 2012-01-11 |  15 |
| orange | 2012-02-12 |   8 |
| orange | 2012-03-13 |  11 |
| orange | 2012-04-14 |   9 |
| peach  | 2012-03-13 |   5 |
| peach  | 2012-04-14 |  15 |
-----------------------------

Ich suche nach der Abfrage, die für jede Artikel , wählt es den ersten Datum wo die val ging unter CONST=10 ohne danach wieder nach oben zu kommen. In diesem Beispiel wäre das so:

-----------------------------
| item   | date       | val |
-----------------------------
| apple  | 2012-03-13 |   7 |
| orange | 2012-04-14 |   9 |
-----------------------------

Ist dies überhaupt möglich, ohne Cursor zu verwenden? Ich suche so etwas in Sybase.

Wenn dies ohne Cursor nicht möglich ist, kann ich die Datensätze in einer Programmiersprache bearbeiten. Da jedoch in meinem konkreten Anwendungsfall die gesamte Historie sehr lang ist, benötige ich eine "geeignete" Abfrage, die gerade "genug" Datensätze für die Berechnung des Datensatzes auswählt, den ich letztlich suche: den jüngsten Datensatz, bei dem val untergetaucht CONST ohne darüber zurückzukehren.

3voto

podiluska Punkte 50039

Dies gibt die Ergebnismenge wie angegeben zurück.

select tablename.* from tablename
inner join 
(
    select tablename.item, min(tablename.[date]) as mindate 
                from tablename
        inner join (
                        select 
                             item, 
                             max([date]) lastoverdate 
                        from tablename 
                        where val>@const 
                        group by item
                               ) lastover
        on tablename.item = lastover.item
        and tablename.[date]> lastoverdate
    group by tablename.item
) below
    on tablename.item = below.item
    and tablename.date = below.mindate

1voto

t-clausen.dk Punkte 42186

Für MySql:

select t.item, t.date1, t.val
from 
(
  select min(date) date1, item from tablename  t
  where not exists (select 1 from tablename where item = t.item 
                    and date1 > t.date1 and val >= 10)
and val < 10
  group by item
) a
inner join 
@t t
on a.item = t.item and a.date1 = t.date1

Für verschiedene Datenbanken wie MS-sql 2005+:

select item, date, val from 
(
  select *, row_number() over (partition by item order by date) rn
  from tablename t
  where not exists (select 1 from @t where item = t.item and 
                    date > t.date and val >= 10)
  and val < 10
) a where rn = 1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X