2017-10-31 1 views
0

Ich versuche, Indexfeld für neue Datensätze aktualisiert, die der Tabelle hinzugefügt wurde. Einige der Datensätze haben bereits einen Index. Wie kann ich die neuen Datensätze mit der nächsten Folge von Werten aktualisieren?Partitionieren von Daten neue Daten mit vorhandenen

Sample data: 
    Index INCIDENT_DT Incident_type Event  CITY   COUNTRY 
    1  1/2/16 0:00 Accident  Truck  Boston   NULL 
    2  1/2/16 0:00 Accident  Car   Boston   NULL 
    3  1/2/16 0:00 Accident  Ground  Sutton   USA 
      1/2/16 0:00 Accident  NULL  NULL   NULL 
      1/2/16 0:00 Accident  NULL  Chicago   NULL 

SELECT ROW_NUMBER() OVER (partition BY INCIDENT_DT order by INCIDENT_DT) AS Index, INCIDENT_DT 
FROM (select distinct INCIDENT_DT, Incident_type, [event], INCIDENT_CITY, INCIDENT_COUNTRY from input) r 

Danke für Ihre Hilfe.

+1

Verwenden Sie die Funktion 'UPDATE'. –

+1

Ich würde aufhören, dies manuell zu tun, und wenden Sie die Eigenschaft [Identität] (https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property) zum Indexfeld. – scsimon

+1

Ich wünschte, es gäbe eine Möglichkeit, @scsimon mehr als ein Like auf den obigen Kommentar zu geben. Dieser Prozess ist der verkörperte Wahnsinn. Es ist eine Race Condition und sehr anfällig für Fehler und/oder Kollisionen. –

Antwort

1

Hers ein Ansatz ist UNION:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) [Index],* FROM 
(
    SELECT INCIDENT_DT, Incident_type, [Event], CITY , COUNTRY FROM <table_name> 
    UNION ALL 
    SELECT '1/2/16 0:00' [INCIDENT_DT], 'Accident' [Incident_type], NULL [Event], NULL CITY, NULL COUNTRY 
    UNION ALL 
    SELECT '1/2/16 0:00' [INCIDENT_DT], 'Accident' [Incident_type], NULL [Event], 'Chicago' CITY, NULL COUNTRY 
) A 

Ergebnis:

Index INCIDENT_DT Incident_type Event CITY COUNTRY 
1  1/2/16 0:00 Accident  Truck Boston NULL 
2  1/2/16 0:00 Accident  Car  Boston NULL 
3  1/2/16 0:00 Accident  Ground Sutton USA 
4  1/2/16 0:00 Accident  NULL NULL NULL 
5  1/2/16 0:00 Accident  NULL Chicago NULL 
0

Yogesh Dank für die Idee. Hätte nie über Gewerkschaften nachgedacht.

Das funktionierte.

SELECT ROW_NUMBER() OVER (partition BY INCIDENT_DT order by grp, index, INCIDENT_DT) AS grp, index, INCIDENT_DT 
FROM (select distinct 1 as grp, index, INCIDENT_DT, Incident_type, [event], INCIDENT_CITY, INCIDENT_COUNTRY from input where index is not null 
union 
select distinct 2 as grp, index, INCIDENT_DT, Incident_type, [event], INCIDENT_CITY, INCIDENT_COUNTRY from input where index is null 
) r 
Verwandte Themen