2016-06-21 7 views
0

Wir versuchen, die Spalte "Rechnung" zu sortieren und nur die Rechnungen für die erste Lieferung unter Teilen der Rechnungen zu sortieren.SQL-Abfrage: Wie nutze ich die Timestamp-Spalte zwischen den Spaltenwerten?

Das ist in dieser Spalte haben wir mehrere Rechnungen. Wir möchten diese Gruppe von Rechnungen unter der Rangspalte auswählen, die aus dem frühesten Zeitstempel besteht.

Art der Timestamp-Spalte:

Der SQL Server-Zeitstempel-Datentyp hat nichts mit Zeiten zu tun, oder geht es nur eine binäre Zahl ist eine Sequenz Timestamp-Spalte, um anzuzeigen, aufgezeichnet wird, und erhöhte jedes Mal, wenn eine Datensatz wird hinzugefügt.

Wir haben versucht, folgende Abfrage:

select * 
from 
    (select 
     myrank = rank() over (partition by a.SalesOrder order by c.Invoice), 
     c.Invoice, c.TimeStamp 
    from 
     OrderDetail a 
    left join 
     OrderMaster b on a.SalesOrder = b.SalesOrder 
    left join 
     InvoiceDetail c on a.SalesOrder = c.SalesOrder 
         and a.SalesOrderLine = c.SalesOrderLine 
    where 
     a.SalesOrder = '218438' 
     and c.LineType = '1' 
     and b.OrderStatus = '9') z 

Beispieldaten:

myrank | SalesOrder | SalesOrderLine |Invoice | TimeStamp 
1 218438 8 207964 0x0000000048CD8CD4 
2 218438 1 207965 0x0000000048CD8CD5 
2 218438 2 207965 0x0000000048CD8CD6 
2 218438 3 207965 0x0000000048CD8CD7 
2 218438 4 207965 0x0000000048CD8CD8 
2 218438 5 207965 0x0000000048CD8CD9 
2 218438 6 207965 0x0000000048CD8CDA 
2 218438 7 207965 0x0000000048CD8CDB 

Erwartete Daten:

Akte Rang sein sollten als Erste Sendung Rechnung und Erste Added Bilanz auf die Basis des Zeitstempels Was sollte das sein? Ausgabe Wenn ich 2 als meinen Rang auswähle

myrank | SalesOrder | SalesOrderLine |Invoice | TimeStamp 
    1 218438 8 207964 0x0000000048CD8CD4 

Vielen Dank im Voraus!

+1

Wie über die Tabellendefinition als Ausgangspunkt? So wie es ist, raten wir, was Sie hier zu tun versuchen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Tatsächlich wird der 'timestamp'-Datentyp auch bei jeder Aktualisierung von a geändert Aufzeichnung. Es ist eine Lösung für Parallelität durch Versionierung des Datensatzes. Wenn zwei Prozesse versuchen, den gleichen Datensatz zu ändern, wird einer von ihnen verlieren, weil ihr "Zeitstempel" nicht mehr mit dem auf dem Datensatz übereinstimmt. – Igor

+0

'Die Zeitstempelspalte wird jedes Mal aufgezeichnet und inkrementiert, wenn ein Datensatz hinzugefügt wird. - Wenn dies der Fall ist, nach dem Sie suchen, können Sie den ersten in einer Sequenz hinzugefügten Datensatz identifizieren und eine 'identity'-Spalte und keinen' timestamp' hinzufügen Säule. Dies würde SQL-Server für jeden neuen Datensatz inkrementiert werden und dann würde der Wert nicht geändert werden. – Igor

Antwort

0

Verwenden Sie ROW_NUMBER.

Ich weiß nicht, Ihre genaue Struktur Tisch, aber es würde zu ähnlich der folgenden sein:

SELECT * 
FROM (
    SELECT c.Invoice, ROW_NUMBER() OVER (PARTITION BY c.Invoice ORDER BY c.TimeStamp ASC) n 
    FROM InvoiceDetails c 
    ) i 
WHERE i.n = 1 
+0

wenn ich Ihre Abfrage verwende. Erhalten dieses als Ergebnis http://paste.ofcode.org/cKzb6WH3wB2AnMbDjVCYyv – NEO

+0

Es teilt mir auch für zwei mehrfache Rechnungen mit, die ich für das erste hergestellte RECHNUNG nicht ordnen konnte. – NEO

+0

Meine Intention ist mit Hilfe der TimeStamp-Spalte. kann ich es früheste Rechnung unter Gruppe von Rechnungen erhalten – NEO

Verwandte Themen