Oracle SQL - DENSE_RANK

Ich habe eine Client-Datentabelle, von der unten ausgewählte Spalten angezeigt werden:

Row_ID  Client_ID  Status_ID  From_date           To_date
  1     123456       4        20/12/2007 18:02    20/12/2007 18:07
  2     789087       4        20/12/2007 18:02    20/12/2007 18:07
  3     789087       4        20/12/2007 18:07    20/12/2007 18:50
  4     789087       4        20/12/2007 18:50    21/12/2007 10:38
  5     123456       4        20/12/2007 18:07    20/12/2007 18:50
  6     123456       4        20/12/2007 18:50    21/12/2007 10:38
  7     123456       4        21/12/2007 10:38    21/12/2007 16:39
  8     789087       4        21/12/2007 10:38    21/12/2007 17:54
  9     789087       4        21/12/2007 17:54    21/12/2007 18:32
 10     789087       4        21/12/2007 18:32    22/12/2007 06:48
 11     123456       5        21/12/2007 16:39
 12     789087       5        22/12/2007 06:48    22/12/2007 10:53
 13     789087       4        22/12/2007 10:53    22/12/2007 11:51
 14     789087       5        22/12/2007 11:51  

Nachdem ich die Daten nach Client_ID und dann nach From_date in aufsteigende Reihenfolge gebracht habe, ist es mein Ziel, jedes Mal, wenn sich der Status für diesen Client ändert, eine berechnete Rank_ID hinzuzufügen, wenn der Status mit der vorherigen Zeile verglichen wird. Die gewünschten Werte für die Rank_ID werden unten angezeigt:

Row_ID  Client_ID  Status_ID  From_date           To_date            Rank_ID
  1     123456       4        20/12/2007 18:02    20/12/2007 18:07    1
  5     123456       4        20/12/2007 18:07    20/12/2007 18:50    1
  6     123456       4        20/12/2007 18:50    21/12/2007 10:38    1
  7     123456       4        21/12/2007 10:38    21/12/2007 16:39    1
 11     123456       5        21/12/2007 16:39                        2
  2     789087       4        20/12/2007 18:02    20/12/2007 18:07    3
  3     789087       4        20/12/2007 18:07    20/12/2007 18:50    3
  4     789087       4        20/12/2007 18:50    21/12/2007 10:38    3
  8     789087       4        21/12/2007 10:38    21/12/2007 17:54    3
  9     789087       4        21/12/2007 17:54    21/12/2007 18:32    3
 10     789087       4        21/12/2007 18:32    22/12/2007 06:48    3
 12     789087       5        22/12/2007 06:48    22/12/2007 10:53    4
 13     789087       4        22/12/2007 10:53    22/12/2007 11:51    5
 14     789087       5        22/12/2007 11:51                        6

Ich versuche, DENSE_RANK als Analysefunktion zu verwenden. Mein "falscher" SQL-Code steht unter

SELECT t1.*, DENSE_RANK () OVER (ORDER BY t1.client_id, t1.status_id) rank_id
FROM (SELECT c.client_ID, c.status_id, c.from_date, c.to_date
      FROM client c
      ORDER BY c.client_id, c.from_date) t1
ORDER BY t1.client_id, t1.from_date

Das Problem, auf das ich stoße, ist, dass es den SQL-Code wie geschrieben angibt und die Rank_ID wie folgt berechnet:

Row_ID  Client_ID  Status_ID  From_date           To_date            Rank_ID
  1     123456       4        20/12/2007 18:02    20/12/2007 18:07    1
  5     123456       4        20/12/2007 18:07    20/12/2007 18:50    1
  6     123456       4        20/12/2007 18:50    21/12/2007 10:38    1
  7     123456       4        21/12/2007 10:38    21/12/2007 16:39    1
 11     123456       5        21/12/2007 16:39                        2
  2     789087       4        20/12/2007 18:02    20/12/2007 18:07    3
  3     789087       4        20/12/2007 18:07    20/12/2007 18:50    3
  4     789087       4        20/12/2007 18:50    21/12/2007 10:38    3
  8     789087       4        21/12/2007 10:38    21/12/2007 17:54    3
  9     789087       4        21/12/2007 17:54    21/12/2007 18:32    3
 10     789087       4        21/12/2007 18:32    22/12/2007 06:48    3
 12     789087       5        22/12/2007 06:48    22/12/2007 10:53    4
 13     789087       4        22/12/2007 10:53    22/12/2007 11:51    3
 14     789087       5        22/12/2007 11:51                        4

Für Datensatz 13 ist die zurückgegebene Rank_ID 3 (wobei 5 eine Änderung des Status für diesen Client im Vergleich zum Status im vorherigen Datensatz für diesen Client darstellt) und für Datensatz 14 ist die zurückgegebene Rank_ID 4, wohingegen I Ich möchte 6, da dies wieder eine Statusänderung für diesen Client im Vergleich zur vorherigen Zeile ist.

Ich schätze, das Problem ist, dass mein SQL die Daten nach Client_ID und dann nach Status_ID anordnet, und so kann ich sehen, warum es die Antworten erzeugt, die es gibt. Das Problem ist unabhängig davon, welche Änderungen ich an der DENSE_RANK-Zeile vornehme. Ich kann die gewünschte Antwort nicht erhalten.

Jede Hilfe wäre dankbar.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage