Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Anzahl Datensätze in einem Zeitraum (https://www.delphipraxis.net/173598-anzahl-datensaetze-einem-zeitraum.html)

xaromz 6. Mär 2013 15:23

Datenbank: MySql • Version: 5.5 • Zugriff über: -

Anzahl Datensätze in einem Zeitraum
 
Hallo,

ich habe eine Tabelle mit den Feldern id, name, date. Mehrerer Einträge können unter name den gleichen Wert haben.
Ich möchte nun die Anzahl der Datensätze ermitteln, deren Name als erstes in einem bestimmten Zeitraum auftritt.

Eine einfache (und elend langsame) Möglichkeit wäre ein Subquery:
Code:
SELECT COUNT(DISTINCT `name`) FROM table WHERE `Date` BETWEEN @start AND @end AND `name` NOT IN (SELECT DISTINCT `name` FROM table WHERE `Date` < @start)
Das muss doch schneller gehen, oder?

Gruß
xaromz

DeddyH 6. Mär 2013 15:42

AW: Anzahl Datensätze in einem Zeitraum
 
Ungetestet:
SQL-Code:
SELECT
  COUNT(X.*)
FROM
  (SELECT
    `Name`, MIN(`Date`)
   FROM
     Table
   WHERE
     MIN(`Date`) BETWEEN @start AND @end
   GROUP BY `Name` 
  ) X

Bummi 6. Mär 2013 15:47

AW: Anzahl Datensätze in einem Zeitraum
 
ich kenne mich mit MySQL nicht aus, geht sowas?

Code:
Select Name from
(
Select `name`,MinD(`Date`) as min,MaxD(`Date`) as Max
FROM Table
GROUP by `name`
) a
where `MinD` >= @start and `MaxD` <= @end

Uwe Raabe 6. Mär 2013 15:49

AW: Anzahl Datensätze in einem Zeitraum
 
Zitat:

Zitat von DeddyH (Beitrag 1206176)
Ungetestet:
SQL-Code:
SELECT
  COUNT(X.*)
FROM
  (SELECT
    `Name`, MIN(`Date`)
   FROM
     Table
   WHERE
     MIN(`Date`) BETWEEN @start AND @end
  ) X

Habe jetzt kein MySQL, aber fehlt da nicht ein GROUP BY Name?

Dies hier funktioniert zumindest unter MSSQL mit den Delphi Demo-Daten:

SQL-Code:
SELECT COUNT(*) FROM
(SELECT CUSTNO, MIN(SALEDATE) as STARTDATE
  FROM [dbo].[ORDERS]
GROUP BY CUSTNO) X
WHERE STARTDATE BETWEEN '1988-05-01' and '1988-05-31'

DeddyH 6. Mär 2013 15:51

AW: Anzahl Datensätze in einem Zeitraum
 
Hast Recht, MySQL ist da IIRC blöderweise nicht so restriktiv, logischerweise sollte aber schon gruppiert werden. Ich ändere das oben mal ab, Danke für den Hinweis.

[edit] Wenn man doch eh schon gruppiert, müsste doch das hier auch funktionieren, wenn ich keinen Denkfehler mache:
SQL-Code:
SELECT
  COUNT(X.*)
FROM
  (SELECT
    `Name`, MIN(`Date`)
   FROM
     Table
   GROUP BY
     `Name`
   HAVING
     MIN(`Date`) BETWEEN @start AND @end
  ) X
[/edit]

xaromz 6. Mär 2013 16:04

AW: Anzahl Datensätze in einem Zeitraum
 
Hallo,

danke für die Hilfe. Der letzte Vorschlag ist super. Noch eine Frage dazu: Das MIN(Date) kann ich doch mit einem Alias versehen und dann beim "HAVING" das Alias einsetzen, oder? Keine Ahnung, ob die DB das selbst optimiert.

Gruß
xaromz

Uwe Raabe 6. Mär 2013 16:05

AW: Anzahl Datensätze in einem Zeitraum
 
Zitat:

Zitat von DeddyH (Beitrag 1206181)
[edit] Wenn man doch eh schon gruppiert, müsste doch das hier auch funktionieren, wenn ich keinen Denkfehler mache:
SQL-Code:
SELECT
  COUNT(X.*)
FROM
  (SELECT
    `Name`, MIN(`Date`)
   FROM
     Table
   GROUP BY
     `Name`
   HAVING
     MIN(`Date`) BETWEEN @start AND @end
  ) X
[/edit]

Das geht natürlich auch. By MSSQL muss man nur entweder die zweite Spalte weglassen oder noch einen Spaltennamen dafür angeben. Da der Wert nicht gebraucht wird, bietet sich weglassen an.

Uwe Raabe 6. Mär 2013 16:07

AW: Anzahl Datensätze in einem Zeitraum
 
Zitat:

Zitat von xaromz (Beitrag 1206185)
Noch eine Frage dazu: Das MIN(Date) kann ich doch mit einem Alias versehen und dann beim "HAVING" das Alias einsetzen, oder? Keine Ahnung, ob die DB das selbst optimiert.

Für MySQL kann ich das nicht sagen, aber MSSQL mag das nicht. Allerdings kann man, wie oben erwähnt, das erste MIN weglassen.

xaromz 6. Mär 2013 16:25

AW: Anzahl Datensätze in einem Zeitraum
 
Ok, danke.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz