kleinstes Fenster ermitteln

kleinstes Fenster ermitteln

am 27.02.2006 10:46:49 von Jens Puruckherr

Hallo,

es werden Konditionen in einer Tabelle mit einem Gültigeitszeitraum FROM
und TO versehen. Es ist auch möglich, dass für einen bestimmten Zeitraum
Sonderkonditionen gelten, die dann den globalen Konditionen vorgezogen
werden sollen.



Kond. FROM TO
-------------------
1 1 31
2 3 5


Es gilt von 1 bis 31 (z.B. Monatstag) die Kondition 1.
Das Marketing will von 3-5 (Monatstag) was tolles machen und es gilt die
Kondition 2.

Wie muss der Query lauten, der mir immer den kleinsten gültigen
Konditonszeitraum liefert? Mir fehlt gerade mal völlig der Ansatz dazu ...

Jens

Re: kleinstes Fenster ermitteln

am 27.02.2006 10:55:07 von Christian Kirsch

Jens Puruckherr schrieb:
> Hallo,
>
> es werden Konditionen in einer Tabelle mit einem Gültigeitszeitraum FROM
> und TO versehen. Es ist auch möglich, dass für einen bestimmten Zeitraum
> Sonderkonditionen gelten, die dann den globalen Konditionen vorgezogen
> werden sollen.
>
>
>
> Kond. FROM TO
> -------------------
> 1 1 31
> 2 3 5
>
>
> Es gilt von 1 bis 31 (z.B. Monatstag) die Kondition 1.
> Das Marketing will von 3-5 (Monatstag) was tolles machen und es gilt die
> Kondition 2.
>
> Wie muss der Query lauten, der mir immer den kleinsten gültigen
> Konditonszeitraum liefert? Mir fehlt gerade mal völlig der Ansatz dazu ...

Wenn ich Dich richtig verstehe, suchst Du das Minimum einer Differenz.
Wenn ich Dich nicht richtig verstehe, dann drück' Dich bitte klarer
aus - was z.B. erwartest Du bei den o.a. Daten als Ausgabe?

Re: kleinstes Fenster ermitteln

am 27.02.2006 11:14:58 von Jens Puruckherr

Christian Kirsch wrote:

>> Kond. FROM TO
>> -------------------------
>> 1 1 31
>> 2 3 5

> Wenn ich Dich richtig verstehe, suchst Du das Minimum einer Differenz.

Ja, kann man so sagen.

> Wenn ich Dich nicht richtig verstehe, dann drück' Dich bitte klarer
> aus - was z.B. erwartest Du bei den o.a. Daten als Ausgabe?

Ja klar, sorry.

Heute ist der 4. also erwarte ich die 2 als Ausgabe.
Am 6. will ich wieder die 1 haben.
Das soll prinzipiell mit mehreren Stufen laufen.


Kond. FROM TO
-------------------------
1 1 31
2 3 5
3 4 4
4 24 28
5 26 27

soll am 4. die 3 liefern, am 5. die 2 und ab dem 6. die 1.
Vom 24 bis 28. die 4, aber am 26 und 27 die 5.

In der Praxis sind FROM und TO ausgewachsene Datumsfelder.


Jens

Re: kleinstes Fenster ermitteln

am 27.02.2006 11:15:33 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net

Re: kleinstes Fenster ermitteln

am 27.02.2006 11:37:55 von Jens Puruckherr

Andreas Kretschmer wrote:

> Kann man generell sagen, daß eine numerisch höhere Kond. zu bevorzugen
> ist?

Nein, da kann sonstwas drinstehen.


> Ich habe Probleme dies zu parsen, ich *vermute*, Du willst zu einem
> Datum die passende Kondition finden, oder?

Ja.

> Unter oben nachgefragte Bedingung und mit Datumsfeldern:

> test=# select max(kond) from foo where '2006/01/04' > begin and '2006/01/04' < ende;

Nein, leider nicht.
Sortierung über die Kondition funzt nicht.


Jens

Re: kleinstes Fenster ermitteln

am 27.02.2006 11:40:47 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net

Re: kleinstes Fenster ermitteln

am 27.02.2006 11:42:14 von Dominik Echterbruch

Jens Puruckherr wrote:
>
> es werden Konditionen in einer Tabelle mit einem Gültigeitszeitraum FROM
> und TO versehen. Es ist auch möglich, dass für einen bestimmten Zeitraum
> Sonderkonditionen gelten, die dann den globalen Konditionen vorgezogen
> werden sollen.
>
> Kond. FROM TO
> -------------------
> 1 1 31
> 2 3 5
>
> Es gilt von 1 bis 31 (z.B. Monatstag) die Kondition 1.
> Das Marketing will von 3-5 (Monatstag) was tolles machen und es gilt die
> Kondition 2.
>
> Wie muss der Query lauten, der mir immer den kleinsten gültigen
> Konditonszeitraum liefert? Mir fehlt gerade mal völlig der Ansatz dazu ...

Ich denke, das hier könnte sein, wonach du suchst (ungetestet):
SELECT a.kond
FROM tabelle a
LEFT JOIN tabelle b ON CURDATE() BETWEEN a.`from` AND a.`to`
AND a.`to` - a.`from` < b.`to` - b.`from`
WHERE b.`to` IS NULL


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: kleinstes Fenster ermitteln

am 27.02.2006 12:09:21 von Christian Kirsch

Jens Puruckherr schrieb:
>
> Heute ist der 4. also erwarte ich die 2 als Ausgabe.
> Am 6. will ich wieder die 1 haben.
> Das soll prinzipiell mit mehreren Stufen laufen.
>
>
> Kond. FROM TO
> -------------------------
> 1 1 31
> 2 3 5
> 3 4 4
> 4 24 28
> 5 26 27
>
> soll am 4. die 3 liefern, am 5. die 2 und ab dem 6. die 1.
> Vom 24 bis 28. die 4, aber am 26 und 27 die 5.
>
> In der Praxis sind FROM und TO ausgewachsene Datumsfelder.
>
>

Du möchtest das Minimum aller Einträge, für die der aktuelle Tag
zwischen FROM und TO liegt, oder?

Die Übersetzung in SQL sollte eigentlich nicht allzu schwer sein.

Re: kleinstes Fenster ermitteln

am 27.02.2006 12:36:37 von Jens Puruckherr

Dominik Echterbruch wrote:

> Ich denke, das hier könnte sein, wonach du suchst (ungetestet):
> SELECT a.kond
> FROM tabelle a
> LEFT JOIN tabelle b ON CURDATE() BETWEEN a.`from` AND a.`to`
> AND a.`to` - a.`from` < b.`to` - b.`from`
> WHERE b.`to` IS NULL

wow, cooler join, wusste gar nicht, das sowas geht.
Ich schaue mir das gleich mal konkret an. Danke

Jens

Re: kleinstes Fenster ermitteln

am 27.02.2006 12:38:23 von Jens Puruckherr

Andreas Kretschmer wrote:

>
> Schnellschuß:
>
> test=# select kond, (ende-begin) from foo where '2006/01/14' > begin and '2006/01/14' < ende order by 2 asc limit 1;
> kond | ?column?
> ------+----------
> 1 | 30
> (1 row)

ja, sieht logisch aus. Danke.
Ich checke es gleich mal, Danke für den Hinweis.

Jens

Re: kleinstes Fenster ermitteln

am 27.02.2006 14:15:23 von Axel Schwenke

Jens Puruckherr wrote:
> Christian Kirsch wrote:
>
>> Wenn ich Dich richtig verstehe, suchst Du das Minimum einer Differenz.
>
> Ja, kann man so sagen.

Dann schreibs doch so hin - SQL kann Differenzen. Und für das Minimum
kannst du ORDER BY und LIMIT verwenden.

> Heute ist der 4. also erwarte ich die 2 als Ausgabe.
> Am 6. will ich wieder die 1 haben.
> Das soll prinzipiell mit mehreren Stufen laufen.
>
>
> Kond. FROM TO
> -------------------------
> 1 1 31
> 2 3 5
> 3 4 4
> 4 24 28
> 5 26 27
>
> soll am 4. die 3 liefern, am 5. die 2 und ab dem 6. die 1.
> Vom 24 bis 28. die 4, aber am 26 und 27 die 5.
>
> In der Praxis sind FROM und TO ausgewachsene Datumsfelder.

mal als Denkanstoß:

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c1 | int(11) | YES | | NULL | |
| c2 | date | YES | | NULL | |
| c3 | date | YES | | NULL | |
+-------+---------+------+-----+---------+-------+

mysql> select * from t1;
+------+------------+------------+
| c1 | c2 | c3 |
+------+------------+------------+
| 1 | 2006-02-01 | 2006-02-28 |
| 2 | 2006-02-03 | 2006-02-05 |
| 3 | 2006-02-04 | 2006-02-04 |
+------+------------+------------+

mysql> set timestamp=unix_timestamp(20060204);
mysql> select *, c3-c2 as len from t1 where c2<=now() and now()<=c3 order by len;
+------+------------+------------+------+
| c1 | c2 | c3 | len |
+------+------------+------------+------+
| 3 | 2006-02-04 | 2006-02-04 | 0 |
| 2 | 2006-02-03 | 2006-02-05 | 2 |
| 1 | 2006-02-01 | 2006-02-28 | 27 |
+------+------------+------------+------+


XL

Re: kleinstes Fenster ermitteln

am 27.02.2006 15:51:16 von Knut Kohl

Hallo Jens,

Jens Puruckherr schrieb am 27. Feb 2006 in de.comp.datenbanken.mysql:

> Hallo,

> es werden Konditionen in einer Tabelle mit einem Gültigeitszeitraum FROM
> und TO versehen. Es ist auch möglich, dass für einen bestimmten Zeitraum
> Sonderkonditionen gelten, die dann den globalen Konditionen vorgezogen
> werden sollen.

Und die RICHTIG komplizierte Konstellation erst...

> Kond. FROM TO
> -------------------
> 1 1 31
> 2 3 5
3 4 20

Preisfrage 1:
Wenn Kond. 3 erlaubt, WELCHE Kond. zieht am 4. bzw. 5.?

Preisfrage 2:
WIE verhindere ich das Anlegen der Kond. 3, wenn NICHT erlaubt?

Eine der beiden Fragen ist auf jeden Fall relevant ;-)

> Jens

Knut


--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: kleinstes Fenster ermitteln

am 27.02.2006 16:05:09 von Dominik Echterbruch

Knut Kohl wrote:
>
>> es werden Konditionen in einer Tabelle mit einem Gültigeitszeitraum FROM
>> und TO versehen. Es ist auch möglich, dass für einen bestimmten Zeitraum
>> Sonderkonditionen gelten, die dann den globalen Konditionen vorgezogen
>> werden sollen.
>
> Und die RICHTIG komplizierte Konstellation erst...
>
>> Kond. FROM TO
>> -------------------
>> 1 1 31
>> 2 3 5
> 3 4 20
>
> Preisfrage 1:
> Wenn Kond. 3 erlaubt, WELCHE Kond. zieht am 4. bzw. 5.?

Das ist doch keine ernst gemeinte Frage, oder? Dei Antwort ist
offensichtlich 2...
Und warum sollte es nicht erlaubt sein?

Folgende Konstellation würde am 4. und 5. des Monats tatsächlich
Probleme geben:

Kond. FROM TO
-------------------
1 1 31
2 3 5
3 4 6


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: kleinstes Fenster ermitteln

am 28.02.2006 09:30:34 von Knut Kohl

Dominik Echterbruch schrieb am 27. Feb 2006 in
de.comp.datenbanken.mysql:

> Knut Kohl wrote:
>>
>> Und die RICHTIG komplizierte Konstellation erst...
>>
>>> Kond. FROM TO
>>> -------------------
>>> 1 1 31
>>> 2 3 5
>> 3 4 20
>>

> Folgende Konstellation würde am 4. und 5. des Monats tatsächlich
> Probleme geben:

> Kond. FROM TO
> -------------------
> 3 4 6

Hmmm, mir entgeht gerade der entscheidende Unterschied zu meiner Kond.
3, Beginn innerhalb Kond. 2, Ende zwischen 5 und 31...

>> 3 4 20

In einem anderen Postings hat der OP geantwortet, dass MAX(kond) nicht
geht, also würde ich halt davon ausgehen, dass Dein (glaube ich) "erster
Treffer" auch nicht funzt...

BTW, als Verkäufer würde ich bei diesen Treffern (Kond. 2 & 3) den mit
dem höheren Preis nehmen :-)

> Grüße,
> Dominik

Regards,
Knut

--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: kleinstes Fenster ermitteln

am 28.02.2006 09:51:52 von Christian Kirsch

Knut Kohl schrieb:
> Dominik Echterbruch schrieb am 27. Feb 2006 in
> de.comp.datenbanken.mysql:
>
>> Knut Kohl wrote:
>>> Und die RICHTIG komplizierte Konstellation erst...
>>>
>>>> Kond. FROM TO
>>>> -------------------
>>>> 1 1 31
>>>> 2 3 5
>>> 3 4 20
>>>
>
>> Folgende Konstellation würde am 4. und 5. des Monats tatsächlich
>> Probleme geben:
>
>> Kond. FROM TO
>> -------------------
>> 3 4 6
>
> Hmmm, mir entgeht gerade der entscheidende Unterschied zu meiner Kond.
> 3, Beginn innerhalb Kond. 2, Ende zwischen 5 und 31...
>
>>> 3 4 20
>

Offenbar. Es ging dem OP darum, das *kleinste* Interval zu finden. In
dem oben zitierten Fall gibt es zwei Intervalle mit der Länge 2
(nämlich Nr. 2 und Nr. 3). In dem von Dir beschriebenen Fall ist das
nicht so: Alle Intervalle sind unterschiedlich lang.

> In einem anderen Postings hat der OP geantwortet, dass MAX(kond) nicht
> geht, also würde ich halt davon ausgehen, dass Dein (glaube ich) "erster
> Treffer" auch nicht funzt...
>

MAX ist eine Aggregatfunktion, also brauchst Du GROUP. ORDER BY
funktioniert ohne GROUP. Abgesehen davon ging es um MIN, nämlich das
*kleinste* Interval.