Announcement

Collapse
No announcement yet.

Tabellen cleanUp

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

  • Tabellen cleanUp

    HI (schwer einen Titel zu finden)

    Ich habe mehrere Tabelle (jeweils mit 'id', 'updatedon', 'updatedby').

    Ich würde gerne aus dieser Tabelle Einträge löschen:
    1. alle in einem Zeitraum (wird mit between gelöst, funktioniert)
    2. von einem User (updatedby) die letzten 3 Einträge nicht UND den ersten nicht

  • #2
    Hallo,

    [highlight=sql]
    DELETE FROM tblTest
    WHERE ID IN
    (
    SELECT TOP 3 ID
    FROM tblTest
    WHERE updatedby = @User
    ORDER BY ID ASC
    );
    [/highlight]

    Willst du hingegen alle Einträge außer dem letzten eines Users löschen (geht aus Frage nicht genau hervor) verwende:

    [highlight=sql]
    DELETE FROM tblTest
    WHERE ID NOT IN
    (
    SELECT MAX(ID)
    FROM tblTest
    GROUP BY updatedby
    );
    [/highlight]

    mfG Gü
    Zuletzt editiert von gfoidl; 03.07.2008, 12:46.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      ich will die letzten drei einträge und den ersten eines users behalten

      Comment


      • #4
        Müsste etwas so gehen (ungeprüft, also nicht gleich mit den Echtdaten machen!):

        delete from tabelle where updatedby = @User
        and (updatedon > (select min(updatedon) from tabelle where updatedby = @User)
        and (updatedon < (select min(updatedon) from
        (select top 3 updatedon from tabelle where updatedby = @User order by updatedon desc) as X)

        bye,
        Helmut

        Comment


        • #5
          also erst mal vielen dank für die antworten,
          aber als eingabeparameter soll nur der zeitrraum dienen und keine userid, da das mit allen usern passieren soll

          Comment


          • #6
            Meine Antwort kannst du damit aber nicht meinen, da deine Vorgabe genau so war:
            ...
            2. von einem User (updatedby) die letzten 3 Einträge nicht UND den ersten nicht
            Von einem Zeitraum kann ich bei diesem Punkt nichts erkennen.

            Falls du das anders meinst, gib mal ein Beispiel, zB mit einem User, der genau an jedem Tag im Monat 5.2008 einen Eintrag hat (und sonst weder davor noch danach einen) und du definierst als Zeitraum vom 5.4.2008 bis 5.5.2008 oder 5.5.2008 bis 20.5.2008 oder 20.5.2008 bis 5.6.2008 - was sollte dann jeweils gelöscht werden und was nicht?

            bye,
            Helmut

            Comment


            • #7
              Also ich habe das Problem ersteinmal so gelöst:

              SELECT * FROM aaaa WHERE (updatedOn NOT IN
              (SELECT TOP 3 updatedOn FROM aaaa ORDER BY updatedBy, updatedOn DESC))
              AND (updatedOn NOT IN
              (SELECT TOP 1 updatedOn FROM aaaa ORDER BY updatedBy, updatedOn ASC))
              AND updatedOn NOT BETWEEN


              Der nächste Part wäre es, diesen Befehl noch zu ergänzen, dass die letzte Woche eines Monats ausser acht gelassen wird

              Comment


              • #8
                Hallo,

                [highlight=sql]
                DELETE FROM #tblTest
                WHERE ID NOT IN
                (
                SELECT ID
                FROM #tblTest AS t1
                WHERE t1.ID IN
                (
                SELECT TOP 3 ID
                FROM #tblTest AS t2
                WHERE t1.updatedby = t2.updatedby
                )
                UNION
                SELECT MAX(ID)
                FROM #tblTest
                GROUP BY updatedby
                );
                [/highlight]

                Das mit dem Zeitraum müsste wohl in weiteren Abfrage gelöst werden.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Das sind meine Werte für einen User:
                  • 20070101 00:00:00
                  • 20070201 00:00:00
                  • 20070301 00:00:00
                  • 20080101 00:00:00
                  • 20080202 00:00:00
                  • 20060101 00:00:00


                  Ich bekomme dann diese als Ergebnis:
                  • 20080101 00:00:00
                  • 20060101 00:00:00


                  Leider nicht ganz richtig
                  Aber danke


                  Und hiermit bekomme ich die letzten beiden PLUS den ersten????

                  SELECT updatedOn, updatedBy FROM aaaa AS table1
                  WHERE table1.updatedOn NOT IN

                  (SELECT TOP 3 updatedOn
                  FROM aaaa AS table2
                  WHERE table1.updatedby = table2.updatedby)

                  Comment


                  • #10
                    SELECT * FROM aaaa

                    WHERE updatedOn NOT IN(

                    SELECT updatedOn FROM aaaa AS table1
                    WHERE table1.updatedOn IN

                    (SELECT TOP 3 updatedOn
                    FROM aaaa AS table2
                    WHERE table1.updatedby = table2.updatedby ORDER BY updatedOn)

                    Comment


                    • #11
                      Danke, habe es jetzt folgendermasen gelöst:

                      SELECT *
                      FROM Budget AS tempTable1
                      WHERE updatedOn NOT BETWEEN
                      DATEADD("d", -7, DATEADD("d", -DAY(CAST(updatedOn as Datetime)), DATEADD("m", 1, CAST(updatedOn AS Datetime))))
                      AND
                      DATEADD("d", -DAY(CAST(updatedOn as Datetime)), DATEADD("m", 1, CAST(updatedOn AS Datetime)))
                      AND
                      tempTable1.updatedOn NOT IN(
                      (SELECT TOP 3 updatedOn
                      FROM Budget AS tempTable2
                      WHERE tempTable1.updatedby = tempTable2.updatedby ORDER BY updatedOn DESC)
                      )
                      ;


                      Jetzt muss ich das nur noch in nen DELETE umwandeln, allerdings auch nicht so einfach, da ich ja temporäre tabellen habe

                      Comment

                      Working...
                      X