Daten richtig beim Import richtig einsortieren

07/11/2008 - 15:32 von frankreimann | Report spam
Hallo Gruppe,
es steht die Aufgabe, in eine bestehende Tabelle Daten zu importieren
und sie dem zeitlichen Verlauf entsprechend richtig einzusortieren.
Die Zeilen besitzen jeweils ein Beginn- und Endedatum, einen Namen
sowie ein Statusfeld.
Struktue s. unten

CREATE TABLE [dbo].[user](
[id_user] [int] IDENTITY(1,1) NOT NULL,
[username] [char](25) NOT NULL,
[beginn] [datetime] NOT NULL,
[ende] [datetime] NOT NULL,
[status] [smallint] NOT NULL
) ON [PRIMARY]


Der Inhalt könnte so aussehen:

1 user1 01.10.2008 00:00:00 01.01.2050 00:00:00 1
2 user2 05.10.2008 00:00:00 01.01.2050 00:00:00 1
3 user3 06.10.2008 00:00:00 08.10.2008 00:00:00 1
4 user3 09.10.2008 00:00:00 13.10.2008 00:00:00 1
5 user3 14.10.2008 00:00:00 01.01.2050 00:00:00 1


Nun kommen Eintràge hinzu für user, die bereits Eintràge aufweisen.
Dieser kann ein aktuelles Beginndatum haben oder eines, das in der
Vergangenheit liegt. Logischerweise müssen dann die Datumsangaben der
bereits existierenden Eintràge "umgebogen" werden, damit der zeitliche
Schluss wieder hergestellt ist:

a) ermitteln letzter gültiger Eintrag
b) Endedatum im alten, noch gültigen Datensatz auf Beginndatum-1(Tag)
des neuen Datensatzes setzen
c) neuen Datensatz einfügen

Bisher habe ich diesen Abgleich über Cursor realisiert, bin aber der
Meinung, dass es auch mit einem entsprechenden update (alte
Datensàtze) funktionieren muss. Um ehrlich zu sein, fehlt es mir ein
wenig an Fantasie für eine Ansatz. Ich wàre für eine Idee sehr
dankbar.

Beste Grüße
Frank
 

Lesen sie die antworten

#1 Christoph Muthmann
11/11/2008 - 14:17 | Warnen spam
frankreimann wrote:
Hallo Gruppe,
es steht die Aufgabe, in eine bestehende Tabelle Daten zu importieren
und sie dem zeitlichen Verlauf entsprechend richtig einzusortieren.
[snip]



Hallo Frank,
das Thema scheint hier nicht so der Renner zu sein, aber ich versuche mich
mal an einer Antwort.
Falls Du nicht darauf verzichten kannst das Ende-Datum in der Tabelle
abzulegen und nur bei Bedarf aus dem Folgesatz zu ermitteln, könnte es evtl.
so gehen:

CREATE TABLE #user(
[id_user] [int] IDENTITY(1,1) NOT NULL,
[username] [char](25) NOT NULL,
[beginn] [datetime] NOT NULL,
[ende] [datetime] NOT NULL,
[status] [smallint] NOT NULL
) ON [PRIMARY]

CREATE TABLE #user_imp(
[id_user] [int] IDENTITY(1,1) NOT NULL,
[username] [char](25) NOT NULL,
[beginn] [datetime] NOT NULL,
[ende] [datetime] NOT NULL,
[status] [smallint] NOT NULL
) ON [PRIMARY]

Insert into #user (username, beginn, ende, status) values('user1',
'20081001', '20500101', 1);
Insert into #user (username, beginn, ende, status) values('user2',
'20081005', '20500101', 1);
Insert into #user (username, beginn, ende, status) values('user3',
'20081006', '20081008', 1);
Insert into #user (username, beginn, ende, status) values('user3',
'20081009', '20081013', 1);
Insert into #user (username, beginn, ende, status) values('user3',
'20081014', '20500101', 1);

select *
from #user

Insert into #user_imp (username, beginn, ende, status) values('user3',
'20081010', '20081013', 1);

select *
from #user_imp

wird
update #user
set ende = b.beginn-1
from #user a
inner join #user_imp b
on a.username = b.username
where a.beginn < b.beginn
and a.ende >= b.ende

Insert into #user (username, beginn, ende, status) select username, beginn,
ende, status from #user_imp;

select *
from #user
order by username, beginn

go
drop table #user
drop table #user_imp

Einen schönen Tag noch,
Christoph
Microsoft SQL Server MVP
http://www.insidesql.org

Ähnliche fragen