date_trans、time_trans、priceという列を含むテーブルがあります。クエリを選択した後、価格列の連続した等しい値として計算される新しい列「Count」を追加し、連続する等しい価格を持つ前の行が最終結果から削除されます。現在クエリを最適化するか、LINQ相当を提案する
date_trans time_trans price **Count**
2011-02-22 09:39:59 58.02 1
2011-02-22 09:40:03 58.1 *ROW WILL BE REMOVED
2011-02-22 09:40:07 58.1 *ROW WILL BE REMOVED
2011-02-22 09:40:08 58.1 3
2011-02-22 09:40:10 58.15 1
2011-02-22 09:40:10 58.1 *ROW WILL BE REMOVED
2011-02-22 09:40:14 58.1 2
2011-02-22 09:40:24 58.15 1
2011-02-22 09:40:24 58.18 *ROW WILL BE REMOVED
2011-02-22 09:40:24 58.18 *ROW WILL BE REMOVED
2011-02-22 09:40:24 58.18 3
2011-02-22 09:40:24 58.15 1
選択するために、SQLクエリまたはLINQ式を提案してくださいテーブルから
、私は選択クエリもそれを行うと、選択したすべての行をループすることができますが、何百万人を選ぶとき:期待される出力を参照してください。行の数時間かかる
私の現在のコード:
string query = @"SELECT date_trans, time_trans, price
FROM tbl_data
WHERE date_trans BETWEEN '2011-02-22' AND '2011-10-21'
AND time_trans BETWEEN '09:30:00' AND '16:00:00'";
DataTable dt = oUtil.GetDataTable(query);
DataColumn col = new DataColumn("Count", typeof(int));
dt.Columns.Add(col);
int priceCount = 1;
for (int count = 0; count < dt.Rows.Count; count++)
{
double price = Convert.ToDouble(dt.Rows[count]["price"]);
double priceNext = (count == dt.Rows.Count - 1) ? 0 : Convert.ToDouble(dt.Rows[count + 1]["price"]);
if (price == priceNext)
{
priceCount++;
dt.Rows.RemoveAt(count);
count--;
}
else
{
dt.Rows[count]["Count"] = priceCount;
priceCount = 1;
}
}
私は、SQLの解析関数を使用することが可能だと思います。遅刻しているので、私の脳はそれをすべて処理することができませんが、私が休んだとき、私は戻ってきて答えが必要かどうかを見ていきます。しかし、私はあなたが[この回答](http://stackoverflow.com/questions/7854854/getting-all-consecutive-rows-differing-by-certain-value)とそれがどのように分析関数を使用するかを見て始めなければならないと思います。 – Ally