Ich habe die folgende Tabelle (SQFiddle, with sample data here):MySql Rückkehr Zeilen mit dem höchsten Wert, am oder vor dem Datum
|-------------------------------------------------------|
| id |data_date | value | score | created_at |
|-------------------------------------------------------|
| 1 | 2015-01-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 2 | 2015-02-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 3 | 2015-03-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 4 | 2015-01-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 5 | 2015-03-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 6 | 2015-03-01 | 15 | 15 | 2016-07-03 09:00:00 |
|-------------------------------------------------------|
Was ich tun möchte, zurückzukehren für jeden data_data
einen einzelnen Datensatz ist, mit der höchsten Punktzahl auf einem gegebenen created_at
Datum.
Das erwartete Ergebnis für die Ergebnisse auf 2016.07.02 wäre:
|-------------------------------------------------------|
| id |data_date | value | score | created_at |
|-------------------------------------------------------|
| 4 | 2015-01-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 2 | 2015-02-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 5 | 2015-03-01 | 15 | 20 | 2016-07-02 09:00:00 |
|-------------------------------------------------------|
Was habe ich ist bisher erreichen den einzigen höchste erzielte Rekord für jeden data_data
zurückzukehren, aber ich kann nicht scheinen, um die richtige Bedingung hinzuzufügen, um das Feld created_at
zu berücksichtigen.
select `my_table`.*
from `my_table`
left outer join `my_table` as `t2`
on `my_table`.`data_date` = `t2`.`data_date` AND
(
(`my_table`.`score` < `t2`.`score`) OR
(`my_table`.`score` = `t2`.`score` AND `my_table`.`id` < `t2`.`id`)
)
where `t2`.`data_date` is null
order by `my_table`.`data_date` asc
Dies liefert folgende Ergebnisse:
|-------------------------------------------------------|
| id |data_date | value | score | created_at |
|-------------------------------------------------------|
| 4 | 2015-01-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 2 | 2015-02-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 6 | 2015-03-01 | 15 | 15 | 2016-07-03 09:00:00 |
|-------------------------------------------------------|
eine Abfrage wie die folgenden verwenden, alle Datensätze am oder vor dem 2. Juli mit der höchsten Punktzahl erstellt zu bekommen:
select `my_table`.*
from `my_table`
left outer join `my_table` as `t2`
on `my_table`.`data_date` = `t2`.`data_date` AND
(
(`my_table`.`score` < `t2`.`score`) OR
(`my_table`.`score` = `t2`.`score` AND `my_table`.`id` < `t2`.`id`)
) AND
DATE_FORMAT(my_table.created_at, '%Y-%m-%d') <= '2016-07-02' AND
DATE_FORMAT(t2.created_at, '%Y-%m-%d') <= '2016-07-02'
where `t2`.`data_date` is null
order by `my_table`.`data_date` asc
Returns das folgende falsche Ergebnis (Zeile 6 sollte nicht zurückgegeben werden):
|-------------------------------------------------------|
| id |data_date | value | score | created_at |
|-------------------------------------------------------|
| 4 | 2015-01-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 2 | 2015-02-01 | 10 | 10 | 2016-07-01 09:00:00 |
| 5 | 2015-03-01 | 15 | 20 | 2016-07-02 09:00:00 |
| 6 | 2015-03-01 | 15 | 15 | 2016-07-03 09:00:00 |
|-------------------------------------------------------|
Zusammengefasst
Für einen einzelnen data_date
können mehrere Datensätze sein, die jeweils eine andere value
und eine andere score
haben. Ich möchte die einzelne Zeile für jede data_data
zurückgeben, die die höchste score
hat, die an oder vor einem bestimmten Datum erstellt wurde. I.e. Wenn ein data_date
einen Datensatz an jedem Tag der Woche (Mo-Fr) erstellt hat, möchte ich vielleicht den höchsten Wert, der am Mittwoch für jeden verfügbar war data_data
.
Aus Ihrer Beschreibung, sicherlich die Ergebnisse für 07-01 sind 1,2,3 – Strawberry
Sie haben recht. Ich hatte mich vertippt, in der obigen Frage behoben. – Amo
OK, aber jetzt verstehe ich nicht, warum 2 überhaupt im Ergebnis erscheinen würde. – Strawberry