Mai*_*din 7 mysql sql linq linq-to-objects linq-to-sql
我有一个包含列date_trans,time_trans,price的表.在选择查询之后,我想添加一个新列"Count",它将被计算为price列的连续相等值,并且将从最终结果中删除具有连续相等价格的先前行.查看预期输出:
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
Run Code Online (Sandbox Code Playgroud)
请建议从表中选择一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个有趣的事情。我认为你需要的是这样的:
SELECT MAX(date_trans), MAX(time_trans), MAX(price), COUNT(*)
FROM
(SELECT *, ROW_NUMBER() OVER(PARTITION BY price ORDER BY date_trans, time_trans) - ROW_NUMBER() OVER(ORDER BY date_trans, time_trans) AS grp
FROM transactions) grps
GROUP BY grp
Run Code Online (Sandbox Code Playgroud)
更新
分组列还需要包含“价格”,否则组可能不唯一。另一件事是,日期和时间列应合并为日期时间列,以便最大日期时间值在一天结束时开始并在第二天开始时结束的组中是正确的。这是更正后的查询。
SELECT MAX(CAST(date_trans AS DATETIME) + CAST(time_trans AS DATETIME)) , MAX(price), COUNT(*)
FROM
(SELECT *,
CAST(ROW_NUMBER() OVER(PARTITION BY price ORDER BY date_trans, time_trans) - ROW_NUMBER() OVER(ORDER BY date_trans, time_trans) AS NVARCHAR(255)) + '-' + CAST(price AS NVARCHAR(255)) AS grp
FROM transactions
ORDER BY date_trans, time_trans) grps
GROUP BY grp
Run Code Online (Sandbox Code Playgroud)
使用“grp”列作为字节数组或 bigint 而不是 nvarchar 可能会更优化查询。您还提到了您可能想要在组内求和的“体积”列。
归档时间: |
|
查看次数: |
230 次 |
最近记录: |