it-swarm.com.de

SQL: Gruppieren Sie den Mindestwert in einem Feld, während Sie verschiedene Zeilen auswählen

Hier versuche ich zu tun. Nehmen wir an, ich habe diese Tabelle t:

id | record_date | other_cols
18 | 2011-04-03  | x
18 | 2012-05-19  | y
18 | 2012-08-09  | z
19 | 2009-06-01  | a
19 | 2011-04-03  | b
19 | 2011-10-25  | c
19 | 2012-08-09  | d

Ich möchte für jede ID die Zeile auswählen, die das minimale Datensatzdatum enthält. Also würde ich bekommen:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a

Die einzigen Lösungen, die ich für dieses Problem gesehen habe, gehen davon aus, dass alle Einträge von record_date unterschiedlich sind, dies ist jedoch in meinen Daten nicht der Fall. Die Verwendung einer Unterabfrage und einer inneren Verknüpfung mit zwei Bedingungen würde zu doppelten Zeilen für einige IDs führen, die ich nicht möchte:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a
46
user2765924

Wie wäre es mit so etwas

SELECT mt.*,     
FROM MyTable mt INNER JOIN
    (
        SELECT ID, MIN(Record_Date) MinDate
        FROM MyTable
        GROUP BY ID
    ) t ON mt.ID = t.ID AND mt.Record_Date = t.MinDate

Dadurch wird das Mindestdatum pro ID und dann die auf diesen Werten basierenden Werte abgerufen. Das einzige Mal, wenn Sie Duplikate hätten, ist es, wenn für dieselbe ID ein Minimum von record_dates vorhanden ist.

65
Adriaan Stander

Ich könnte Ihr erwartetes Ergebnis erreichen, indem Sie dies in mysql tun:

 SELECT id, min(record_date), other_cols 
  FROM mytable
  GROUP BY id

Geht das für dich?

10
Math

Um das billigste Produkt in jeder Kategorie zu erhalten, verwenden Sie die MIN () - Funktion in einer korrelierten Unterabfrage wie folgt:

    SELECT categoryid,
       productid,
       productName,
       unitprice 
    FROM products a WHERE unitprice = (
                SELECT MIN(unitprice)
                FROM products b
                WHERE b.categoryid = a.categoryid)

Die äußere Abfrage durchsucht alle Zeilen in der Produkttabelle und gibt die Produkte zurück, bei denen die Einheitspreise mit dem niedrigsten Preis in jeder Kategorie übereinstimmen, der von der korrelierten Unterabfrage zurückgegeben wird.

6
DIMI

Das macht es einfach:

select t2.id,t2.record_date,t2.other_cols 
from (select ROW_NUMBER() over(partition by id order by record_date)as rownum,id,record_date,other_cols from MyTable)t2 
where t2.rownum = 1
1
jeff

Die folgende Abfrage enthält das erste Datum für jeden Arbeitsauftrag (in einer Tabelle, in der alle Statusänderungen angezeigt werden):

SELECT
    WORKORDERNUM,
    MIN(DATE)
FROM
    WORKORDERS
WHERE
    DATE >= to_date('2015-01-01','YYYY-MM-DD')
GROUP BY
    WORKORDERNUM
0
SRVFan

Ich möchte einige der anderen Antworten hier hinzufügen, wenn Sie nicht das Element first benötigen, sondern die zweite Zahl sagen. Sie können beispielsweise rownumber in einer Unterabfrage verwenden und Ihr Ergebnis davon ableiten.

SELECT * FROM
(
    SELECT
        ROW_NUM() OVER (PARTITION BY Id ORDER BY record_date, other_cols) as rownum,
        *
    FROM products P
) INNER
WHERE rownum = 2

Dadurch können Sie auch mehrere Spalten in der Unterabfrage bestellen. Dies kann hilfreich sein, wenn zwei Datensatzdaten identische Werte haben. Sie können sich bei Bedarf auch von mehreren Spalten trennen, indem Sie sie durch ein Komma voneinander trennen

0
Reese De Wind

Dies ist eine alte Frage, aber dies kann für jemanden nützlich sein. In meinem Fall kann ich keine Unterabfrage verwenden, da ich eine große Abfrage habe und ich brauche min () für mein Ergebnis, wenn ich die Unterabfrage der Datenbank benötige Wiederholen Sie meine große Frage. Ich benutze Mysql

select t.* 
    from (select m.*, @g := 0
        from MyTable m --here i have a big query
        order by id, record_date) t
    where (1 = case when @g = 0 or @g <> id then 1 else  0 end )
          and (@g := id) IS NOT NULL

Grundsätzlich habe ich das Ergebnis bestellt und dann eine Variable eingefügt, um nur den ersten Datensatz in jeder Gruppe zu erhalten.

0