in MoreLinq gibt es eine Lag-Extension-Methode, aber es ist nur in Linq to Objects unterstützt ...
Was können Sie tun, wenn Sie, dass für eine C# Linq Antwort suchen können Sie:
Im Grunde ordnen Sie Ihre Daten den richtigen Weg und fügen dann einen Zeilenindex hinzu, während der Preis (und die Produkt-ID) immer noch gleich ist. Dann gruppieren Sie sich danach und wählen Sie das min
Datum.
int groupingIndex = 0;
int previousPrice = 0;
var response = data
.OrderBy(item => item.Product_ID)
.ThenBy(item => item.Date)
.Select(item =>
{
if (item.Price != previousPrice)
{
previousPrice = item.Price;
groupingIndex++;
}
return new { Index = groupingIndex, Item = item };
})
.GroupBy(item => new { item.Index, item.Item.Product_ID, item.Item.Price })
.Select(group => new Record
{
Product_ID = group.Key.Product_ID,
Price = group.Key.Price,
Date = group.Min(item => item.Item.Date)
}).ToList();
Und wenn Sie nichts dagegen haben den Betrieb in der C# und nicht die DB zu tun (und eine Beta-Version des MoreLinq verwenden) dann:
int index = 0;
var result2 = data
.OrderBy(item => item.Product_ID)
.ThenBy(item => item.Date)
.Lag(1, (current, previous) => new { Index = (current.Price == previous?.Price ? index : ++index), Item = current })
.GroupBy(item => new { item.Index, item.Item.Product_ID, item.Item.Price })
.Select(group => new Record { Product_ID = group.Key.Product_ID, Price = group.Key.Price, Date = group.Min(item => item.Item.Date) })
.ToList();
Sie können problemlos eine gespeicherte Prozedur verwenden. Gehe durch alle Datensätze ('FOR SELECT ..... INTO ... ORDER BY .....') und wenn Price change, rufe 'SUSPEND' an. –
Oder Sie können dies versuchen (nicht getestet - haben keine Firebird-Instanz hier): 'SELECT Produkt_ID, MIN (Datum), Preis von xxx GROUP BY Produkt_ID, Datum, Preis' –
Das würde nur erste Instanz des gleichen Preises abrufen, aber es würde nicht die 2. Preisänderung abrufen (10 am 04-01) – Ninjago