2016-03-29 13 views
0

Wie erhalte ich die überarbeitete Tabelle aus der ursprünglichen Tabelle mit SQL? Grundsätzlich wollte ich die Zeilen der Kundendaten basierend auf dem Datum vergleichen. Kunden, die einen Artikel innerhalb von 15 Tagen in einem Monat gekauft haben, müssen einen Kauf tätigen. Zum Beispiel, für den Kunden Paolo Arcotti, obwohl er 3 Käufe innerhalb von 15 Tagen getätigt hat, wird nur der erste Kauf berücksichtigt und wird als 1 Kauf gezählt; während für Kunden Hanna Moss, dies als 2 Käufe betrachtet wird. Kurz gesagt, ich möchte Einkäufe vom 1.-15. Januar als 1 Kauf und 16-30 als weiteren Einkauf kategorisieren.SQL - Vergleichen von Daten in einer Tabelle

Original Table vs Revised Table

+0

Bitte markieren Sie Ihre Frage mit der Datenbank Sie verwenden. –

+0

Was hast du schon probiert? Welche Datenbanktechnologie verwenden Sie? – istovatis

Antwort

0

Datenbanken Unterstützung Datumsfunktionen, aber jede Datenbank ist anders. Der folgende Ansatz verwendet not exists und Funktionen für den Tag, den Monat und das Jahr eines Datums:

select t.* 
from original as t 
where not exists (select 1 
        from original as t2 
        where t2.customer = t.customer and 
         datepart("yyyy", t2.date) = datepart("yyyy", t.date) and 
         datepart("m", t2.date) = datepart("m", t.date) and 
         t2.date < t.date and 
         ((datepart("d", t2.date) <= 15 and datepart("d", t.date) <= 15) or 
         (datepart("d", t2.date) > 15 and datepart("d", t.date) > 15) 
         ) 
       ); 
+0

Wie entferne ich weitere Duplikate aus den obigen Ergebnissen? Ich habe einen kleinen Fehler bemerkt, wenn der obige Code verwendet wird. Wenn beispielsweise derselbe Kunde am selben Tag 3 Käufe tätigt, berechnet das Skript weiterhin 3 Käufe statt 1, am wahrscheinlichsten aufgrund der Zeile Nr. 8 -t2.date saturday

+0

@saturday. . . Eine eindeutige Kennung für jede Zeile würde beim Entfernen solcher Duplikate helfen. Möchten Sie eine andere Frage mit Beispieldaten und gewünschten Ergebnissen stellen? –

0
;with cte as 
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate) as rn from #test 
where DATEPART(d,orderdate)<=15 
) 
, cte1 as 
(
select *,DATEPART(d,orderdate) as dayofmonth1,row_number() over(partition by customer order by customer,orderdate)as rn from #test 
where DATEPART(d,orderdate)>15 
) 
select *from cte where rn=1 
union select *from cte1 where rn=1 
Verwandte Themen