2016-07-13 5 views
1

Meine Tabelle:alle Zeilen auswählen, die mehr als eine ID in einem bestimmten Datum haben

Items | Price | UpdateAt 
    1  | 2000 | 02/02/2015 
    2  | 4000 | 06/04/2015 
    3  | 2150 | 07/05/2015 
    4  | 1800 | 07/05/2015 
    5  | 5540 | 08/16/2015 
    4  | 1700 | 12/24/2015 
    5  | 5200 | 12/26/2015 
    2  | 3900 | 01/01/2016 
    4  | 2000 | 06/14/2016 

Wie Sie sehen können, ist dies eine Tabelle, die Elemente Preis sowie ihre alten Preis vor dem letzten Update hält .

Jetzt muss ich die Zeilen finden, die:

  • UpdateAt mehr als 1 Jahr ab jetzt vor ist
  • Muss aktualisiert Preis mindestens einmal seit
  • Sind nicht die meisten up- Preis to-date

Also mit diesen Bedingungen sollte das Ergebnis aus der obigen Tabelle sein:

Items | Price | UpdateAt 
    2  | 4000 | 06/04/2015 
    4  | 1800 | 07/05/2015 

kann ich erreichen, was ich mit diesen

Declare @LastUpdate date set @LastUpdate = DATEADD(YEAER, -1, GETDATE()) 
select Items, UpdateAt from ITEM_PRICE where Items in (
    select Items from (
     select Items, count(Items) as C from ITEM_PRICE group by Items) T 
    where T.C > 1) 
and UpdateAt < @LastUpdate 

brauche Aber da ich noch einen Neuling in Sqlserver ist, und dieses Bedürfnis in vb.net getan werden, entlang dieser Abfrage mit vieler Auswahl in Leiten scheint schlampig und schwer zu halten.

Also möchte ich fragen, ob mir jemand eine einfachere Lösung geben kann?

Entschuldigung, ich habe meine Frage bearbeitet, da ich nach dem Versuch von @Tim Biegeleisens Antwort noch eine weitere Bedingung erfüllen muss, die in der Tat die richtige für die Frage vor der Bearbeitung ist. Und ich kann das nicht mehr herausfinden.

Warum brauche ich alle diese Bedingung, es ist, weil ich die Tabelle aufräumen muss: Löschen der Daten, die älter als 1 Jahr ist, während immer noch die aktuellsten Artikel Preis.

+0

Artikel 2 wird nur einmal aktualisiert, wie es Ihr erwartetes Ergebnis ist ? – TheGameiswar

+0

Punkt 3 wurde im letzten Jahr nie aktualisiert, zumindest nicht in den Beispieldaten, die Sie uns gezeigt haben. –

+0

@TheGameiswar Artikel 2 wird einmal am 06.04.2015 aktualisiert, also mehr als 1 Jahr, und am 01.01.2016 aktualisiert, so dass die Zeile mit dem 04.06.2015 im Ergebnis erscheinen sollte. – HaPhan

Antwort

1

In meiner Antwort unten verwende ich eine Unterabfrage, um alle Elemente zu identifizieren, die in der Tabelle während des letzten Jahres erscheinen. Dies ist die Anforderung, mindestens einmal einen aktualisierten Preis zu haben. In der äußeren Abfrage beschränke ich mich auf nur Datensätze, die älter als ein Jahr sind, das ist der andere Teil der Anforderung. Eine INNER JOIN wird verwendet, weil wir Datensätze filtern wollen, die nicht beide Kriterien erfüllen.

SELECT t1.Items, t1.Price, t1.UpdateAt 
FROM ITEM_PRICE t1 
INNER JOIN 
(
    SELECT DISTINCT Items 
    FROM ITEM_PRICE 
    WHERE UpdateAt > DATEADD(year, -1, GETDATE()) 
) t2 
    ON t1.Items = t2.Items 
WHERE t1.UpdateAt <= DATEADD(year, -1, GETDATE()) 

Wieder einmal hat SQL Fiddle Probleme beim Simulieren von SQL Server. Aber ich ging voran und erstellte eine Fiddle in MySQL, die fast identisch mit meiner SQL Server Antwort aussieht. Sie können überprüfen, ob die Logik und die Ausgabe korrekt sind.

SQLFiddle

+0

Es tut mir leid, ich kann nicht früher antworten. Ja, deine Antwort ist richtig, bekomme das gewünschte Ergebnis, und es schlägt auch mein. Ich habe deine Antwort versucht, und es führt mich zu einer weiteren Bedingung .. den aktuellsten Preis herauszufiltern, als ich meine Frage bearbeitet habe.Während ich versuche, es herauszufinden, hoffe ich, dass Sie etwas mehr von Ihrer Zeit nehmen können, um mir zu helfen. – HaPhan

+0

Ich folge nicht, was Ihre neue Anforderung ist, weil es keine Beispieldaten zeigt, oder die Beispielausgabe didn ändere nicht. Vielleicht möchten Sie eine neue Frage posten, anstatt diese mehrfach zu ändern. –

+0

Ich tat, wie Sie vorschlagen und fügte eine klarere Frage hinzu [http://stackoverflow.com/questions/38367323/cleaning-up-old-record-to-a-spezific-date-how-to-select-the-old-old- aufnehmen] (hier). Ich hoffe, du kannst mir auch eine Idee mitteilen. – HaPhan

Verwandte Themen