【发布时间】:2020-10-19 11:20:42
【问题描述】:
我正在尝试从数据库中获取结果以生成某种矩阵结果以发送回前端。关键是我有 X 轴和 Y 轴的百分位值,我将其分成 10 个部分以获得 10x10 表。为了获得每个值,我计算不同的用户 ID,所以它类似于 1-1、1-2 ... 10-10。
这是我目前想要改进的代码(虽然尚未完成,只是我目前的想法),因为一个接一个地运行 100 个查询似乎不是一个好的解决方案。但是,我有点卡住如何使性能更好,以及是否应该在长度为 100 的字典或多维矩阵数组中返回结果以使其成为良好的实践代码。提前感谢任何人的提示,我的代码如下:
public async Task GenerateMatrix(List<double> x, string xAxis, List<double> y, string yAxis, Parameters parameters)
{
IDictionary<string, string> xDict = GenerateRanges(x, parameters.XAxis);
IDictionary<string, string> yDict = GenerateRanges(y, parameters.YAxis);
var innerJoin = GenerateInnerJoin(parameters);
var whereClauses = GenerateWhereClause(parameters);
var sql = $@"SELECT COUNT(DISTINCT [dbo].[{nameof(Table)}].[{nameof(Table.UserId)}]) FROM [dbo].[{nameof(Table)}] {innerJoin} ";
if (whereClauses.Any())
{
sql += " WHERE " + string.Join(" AND ", whereClauses);
}
for (int i = 0; i < x.Count; i++)
{
var queryToExecute = "";
for (int j = 0; j < y.Count; j++)
{
queryToExecute = sql + " AND " + xDict.Values.ElementAt(i) + " AND " + yDict.Values.ElementAt(j);
var userCount = await Store().QueryScalar<int>(queryToExecute);
}
}
return null;
}
private IDictionary<string, string> GenerateRanges(List<double> axis, string columnTitle)
{
IDictionary<string, string> d = new Dictionary<string, string>();
for (int i = 0; i < axis.Count; i++)
{
var rangeSql = $@" [dbo].[{nameof(Table)}].[{columnTitle}]";
if (i == 0)
{
d.Add(axis[i].ToString(), rangeSql + " < " + axis[i]);
}
else if (i == axis.Count - 1)
{
d.Add(axis[i] + "+", rangeSql + " > " + axis[i]);
}
else
{
d.Add(axis[i-1] + "-" + axis[i], rangeSql + " > " + axis[i-1] + " AND " + rangeSql + " < " + axis[i]);
}
}
return d;
}
sql 看起来像这样:
SELECT
COUNT(DISTINCT [dbo].[Table].[UserId])
FROM [Table]
WHERE Table.[ClientId] = '2'
AND [dbo].[Table].[ProbabilityAlive] < 0.1
AND [dbo].[Table].[SpendAverage] < 24.86
所以会有 10000 行这样的行。
ProbabilityAlive 和 SpendAverage 是来自前端的列标题,可能还有其他列标题。
对于这两列,我计算百分位值,然后我将其分成十部分,一个是 X 轴,另一个是 Y 轴。然后我使用上面的 sql 查询来获取每个矩阵值的值,因为矩阵是 10x10,所以它变成了 100 个查询。
因此,我想获得 100 个整数值,我仍在试图弄清楚是否最好将数据放入字典中,然后将具有范围 xy 和值的键作为选择结果(例如 "0-1", 5472"),或者是否把它放在多维数组或其他东西中。我有xDict,其中包含范围作为键,例如“0-1”,然后是 sql 语句 ProbabilityAlive > 0 AND ProbabilityALive yDict 为 Y 轴添加相同的值。然后我有两个列表 x 和 y 包含 10 个用于这些范围的双精度值
【问题讨论】:
-
这是一个 100% 的 SQL 问题,但缺少实际的 SQL 查询。用样本数据和结果解释你真正想做的事情。也许您所需要的只是
GROUP BY子句中的WITH ROLLUP表达式 -
是的@AndrewMorton
-
您尚未解释数据的外观或您的期望。该代码根本没有帮助。只有第一段和查询是相关的,但它们似乎不相关。什么百分位? T-SQL 具有像PERCENTILE_DISC 这样的百分位函数,可用于连续返回各种百分位。您可以创建一个返回 100 行的查询,其中包含您想要的 X、Y 和百分位数数据,但是您想要什么 do? X 和 Y 值从何而来?
-
您是否尝试为
ProbabilityAlive和ProbabilityAlive字段生成存储桶并为每个组合生成唯一客户的百分位数(或百分比?)? -
并非如此。你描述的是代码,而不是你真正想要得到的输出,数据是什么样的,以及期望的输出是什么
标签: c# sql tsql asp.net-core .net-core