2016-04-24 7 views
0

ich eine Datenbank mit den folgenden Informationen habenORACLE SQL Return nur duplizierte Werte (nicht das Original)

Customer_id, plan_id, plan_start_dte, 

Seit einigen Kundenschalter Pläne gibt es Kunden mit mehreren dupliziert customer_id s, aber mit unterschiedlichen plan_start_dte. Ich versuche zu zählen, wie oft ein Mitglied von jedem anderen Plan zum Prämienplan wechselt (plan_id = 'premium').

Das heißt, ich versuche, grob dies zu tun: Rückgabe aller Zeilen mit doppelten customer_id, mit Ausnahme des ursprünglichen Plan (min(plan_start_dte)), wo plan_id = 'premium' und gruppieren sie durch plan_start_dte.

Ich bin in der Lage, alle doppelten Datensätze mit ihrer Zählung zu erhalten:

with plan_counts as (
    select c.*, count(*) over (partition by CUSTOMER_ID) ct 
    from CUSTOMERS c 
) 
select * 
from plan_counts 
where ct > 1 

Die anderen Schritte haben mich fest. Zuerst habe ich versucht, alles außer dem ursprünglichen Plan auszuwählen:

SELECT CUSTOMERS c 
where START_DTE not in (
    select min(PLAN_START_DTE) 
    from CUSTOMERS i 
    where c.CUSTOMER_ID = i.CUSTOMER_ID 
) 

Aber das ist fehlgeschlagen. Wenn ich das lösen kann, glaube ich, alles, was ich hinzufügen muss, ist eine zusätzliche Bedingung, wo c.PLAN_ID = 'premium' und dann nach Datum gruppieren und zählen. Hat jemand Ideen?

Antwort

0

Ich glaube, Sie lag() wollen:

select c.* 
from (select c.*, 
      lag(plan_id) over (partition by customer_id order by plan_start_date) as prev_plan_id 
     from customers c 
    ) c 
where prev_plan_id <> 'premium' and plan_id = 'premium'; 

Ich bin nicht sicher, was Ausgabe, die Sie wollen. Wie oft dies pro Tag passiert:

select plan_start_date, count(*) 
from (select c.*, lag(plan_id) over (partition by customer_id order by plan_start_date) as prev_plan_id 
     from customers c 
    ) c 
where prev_plan_id <> 'premium' and plan_id = 'premium' 
group by plan_start_date 
order by plan_start_date; 
+0

Ich bekomme "fehlende Fensterspezifikation für diese Funktion"? fehlt die over-Anweisung? Nur um zu verdeutlichen, wenn ein Benutzer einen Plan 4 Mal geändert hat, und das vierte Mal Premium ist, möchte ich, dass dies gezählt wird. Mit etwas herumspielen sieht es so aus, als ob das Folgende mir das gibt, was ich will (Prämienpläne, die nicht original sind) auswählen * von (wähle c. *, Lag (plan_id) über (nach plan_start_dte) als prev_plan_id aus customer_hist c ) c WHERE prev_plan_id IS NOT NULL UND PLAN_ID = ‚premium‘ Aber wenn ich über sie von Monat aggregieren scheinen die Zahlen hoch –

+0

Ja, ich bin zu realisieren ich den richtigen Weg nicht Verzögerung verwendet wird. Versuchte, es zu verwenden, um (mit einem Nullwert) zu kennzeichnen, wenn vor einem Plan für eine Kunden-ID kein Plan vorhanden war. –

Verwandte Themen