über Group by anweisung iterieren

maxxx27

Neuer Benutzer
Beiträge
2
Hallo,

ich habe eine Tabelle die eine Spalte für Datum hat und dahinter diverse Spalten mit einigen Daten. Da man in Schleifen schlecht über das Datum iterieren kann, möchte ich nun eine neue Spalte in die Tabelle einfügen, welche allen Daten des ersten Tages eine 1 zuordnet und dann mit folgenden Tagen je eins dazuzählt.
Sprich in etwa so:
n Datum A B
1 10,02,12 wert1 wert2
1 10.02.12 wert3 wert4
2 11.02.12 wert5 wert6
2 11.02.12 wert7 wert8
3 12.02.12 wert9 wert10 usw.. Die erste Spalte in diesem Beispiel ist quasi die Spalte welche ich erstellen möchte. Der Inhalt der Datensätze pro Tag (also der Werte für A und B) kann pro Tag variieren.

So weit bin ich bis jetzt gekommen:
SELECT Datum
FROM `tabelle
GROUP BY datum
ORDER BY datum
wenn ich in dieser query einen wert n definiere und über die Tage zählen lasse funktioniert das erstmal ganz gut, lasse ich diesen jedoch in die Tabelle schreiben, fängt er an über die einzelnen Werte innerhalb eines Tages zu inkrementieren. Wie kann man das Problem alternativ lösen?
 
Werbung:
Hallo,

ich habe eine Tabelle die eine Spalte für Datum hat und dahinter diverse Spalten mit einigen Daten. Da man in Schleifen schlecht über das Datum iterieren kann, möchte ich nun eine neue Spalte in die Tabelle einfügen, welche allen Daten des ersten Tages eine 1 zuordnet und dann mit folgenden Tagen je eins dazuzählt.

Du suchst also praktisch eine Möglichkeite, Rows zu nummerieren. Da gibt es eine Funktion in SQL, die auch sogar so heißt: row_number().

In Deinem Falle könnte man diese so anwenden:

Code:
test=*# select * from maxx27 ;
  datum  | val
------------+-----
 2014-10-16 |  1
 2014-10-16 |  2
 2014-10-16 |  3
 2014-10-16 |  4
 2014-10-17 |  5
 2014-10-17 |  6
 2014-10-17 |  7
 2014-10-18 |  8
 2014-10-18 |  9
 2014-10-18 |  10
(10 rows)

Time: 0,163 ms
test=*# select r.row_number, a.* from maxx27 a left join (select datum, row_number() over (order by datum) from (select distinct datum from maxx27) x ) r on a.datum=r.datum;
 row_number |  datum  | val
------------+------------+-----
  1 | 2014-10-16 |  1
  1 | 2014-10-16 |  2
  1 | 2014-10-16 |  3
  1 | 2014-10-16 |  4
  2 | 2014-10-17 |  5
  2 | 2014-10-17 |  6
  2 | 2014-10-17 |  7
  3 | 2014-10-18 |  8
  3 | 2014-10-18 |  9
  3 | 2014-10-18 |  10
(10 rows)

Allerdings ist die Entwicklung bei MySQL noch einige Jahre hinter allen anderen Datenbanken, und so kann es das nicht. Wenn Du via Google nach 'mysql row_number' suchst findest aber einige recht lustige Lösungen. Have fun!
 
Die eine der Lösungen. Google ruhig mal dann wirst du sehen welchen Stellenwert MySQL hat.

Code:
MariaDB [tmp]> describe tabelle;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| datum | date        | YES  |     | NULL    |       |
| wert1 | varchar(30) | YES  |     | NULL    |       |
| wert2 | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

MariaDB [tmp]> select * from tabelle;
+------------+-------+-------+
| datum      | wert1 | wert2 |
+------------+-------+-------+
| 2014-01-01 | a     | b     |
| 2014-01-01 | b     | c     |
| 2014-01-10 | e     | f     |
| 2014-01-20 | g     | h     |
| 2014-01-20 | i     | j     |
+------------+-------+-------+
5 rows in set (0.00 sec)

MariaDB [tmp]> SELECT dd.nr, w.* FROM (SELECT
    ->   @row_number := @row_number+1 AS nr,
    ->   d.datum
    ->  FROM
    ->   (SELECT DISTINCT datum FROM tabelle GROUP BY datum) AS d,
    ->   (SELECT @row_number:=0) AS n ) AS dd
    ->    LEFT JOIN tabelle w ON dd.datum =w.datum;
+------+------------+-------+-------+
| nr   | datum      | wert1 | wert2 |
+------+------------+-------+-------+
|    1 | 2014-01-01 | a     | b     |
|    1 | 2014-01-01 | b     | c     |
|    2 | 2014-01-10 | e     | f     |
|    3 | 2014-01-20 | g     | h     |
|    3 | 2014-01-20 | i     | j     |
+------+------------+-------+-------+
5 rows in set (0.00 sec)

MariaDB [tmp]>
 
Werbung:
Zurück
Oben