Announcement

Collapse
No announcement yet.

Frage zu group by und max

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zu group by und max

    Hallo #,

    ich habe folgende Tabellen
    Personal
    PersAZM

    in PersAZM stehen Arbeitszeitmodelle in der form
    Id (primkey), PersonalId, StartDate (date), AZMId

    Eine Person kann also mehrere Modelle besitzen.

    Ich suche jetzt nach einer Query,
    die mir von jeder Person den Eintrag mit dem größten Startdatum anzeigt.

    Das muss mit Max und GroupBy gehen.

    Die Syntax habe ich aber nicht drauf

    Zur Zeit behelfe ich mir mit einer subquery<br>

    select persazm1.* from pers_azm persazm1
    where persazm1.startdate=
    (
    select max(persazm2.startdate) from pers_azm persazm2
    where persazm2.personalid=persazm1.personalid
    )
    <p>
    Das gefällt mir aber nicht so richtig (der SQL Plan zeigt mir einen natural scan)
    <p>
    Danke im voraus

    Heiko

  • #2
    Du kannst
    SELECT
    ...andere Felder...
    MAX (StartDate) AS Startdatum
    FROM...
    schreiben. In die GROUP BY Klausel gehören dann alle Felder, außer dem Startdatum
    Ich glaub allerdings nicht, dass das etwas am Natural Scan ändert. (Die Betonung liegt auf 'glaube', Versuch macht kluch...)
    Vorausgesetzt, dass sich die Datensätze wirklich nur im StartDate unterscheiden, alle anderen selektierten Felder müßen identisch sein

    Comment


    • #3
      Hallo Jochen,

      select id,personalid,max(startdate) as maxstartdate
      from pers_azm
      group by personalid,id

      zeigt mir pro person alle Einträge an.

      Egal,
      ich mach das mit ner SP.

      Da ich sowieso nicht das größte, sondern das größte Datum bis zum einem bestimmten Tag brauche, geht es nicht anders.

      Heik

      Comment


      • #4
        Hallo Heiko,
        trotzdem würde ich mir dann auch den PLAN der SP ansehen, da man hier vielleicht noch etwas optimieren könnte.
        <br>
        Thoma
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment


        • #5
          Hallo Thomas<p>

          hier die SP (ich verwende <noch> kein top 1)
          <p>

          CREATE PROCEDURE SP_GETCURRENTPERSAZM (
          THEDATE DATE)
          RETURNS (
          ID INTEGER,
          THEPERSONALID INTEGER,
          STARTDATE DATE,
          ENDDATE DATE,
          AZMID INTEGER,
          WZMID INTEGER)
          AS
          begin
          for select id from personal order by id into :thepersonalid do
          begin
          for select
          id, startdate, enddate, azmid, wzmid
          from
          pers_azm
          where
          (pers_azm.personalid=:thepersonalid) and
          (pers_azm.startdate<=:thedate)
          order by pers_azm.startdate desc

          into :id, :startdate, :enddate, :azmid, :wzmid

          do
          begin
          suspend ;

          break ;
          end

          end
          /* Procedure Text */
          end

          <p>
          Der Plan<br>

          PLAN SORT ((PERS_AZM INDEX (IDX_PERSAZM_PERSONALIDSTARTDATE)))(PERSONAL ORDER RDB$PRIMARY66)

          <p>
          "Personal" hat 300 Einträge.
          "Pers_Azm" hat 35000 Einträge.
          <p>
          Interessanterweise bringt ein dec index auf personalid,startdate überhaupt nichts

          Heik

          Comment

          Working...
          X