如何取得数据集中的行号(做成绩排名时不希望遍历数据集)?

时间:2022-02-19 19:32:21
SQL Server数据库:select user, score from A order by score DESC
已将查询回的结果保存在DataSet里,如何得到某一个用户的排名数?

不能遍历,因为用户有4种类型,要得到该用户在4种类型中的不同排名数,如果以1000人计,遍历次数就已经相当庞大了!

大家帮忙想点办法,如果能直接取到行号,岂不是很爽,可惜不是Oracle

14 个解决方案

#1


如果用排序呢?然后直接取行号

#2


你形成的DATASET肯定要在DATAGRID或其他的东西里显示呀,譬如你在DATAGRID显示的话,你给DATAGRID加一个行号就性了呀
private DataTable GetRowNumberTable(DataTable dt){
   DataColumn col = new DataColumn("RowNumber",Type.GetType("System.Int32"));
   dt.Columns.Add(col);
   for(int i = 0;i<=dt.Rows.Count-1;i++){
    if(0 == i) 
     dt.Rows[i][col] = 1;
    else 
     dt.Rows[i][col] = Convert.ToInt32(dt.Rows[i-1][col]) +1;
   }
   return dt;
  }

#3


DataView dv = datatable.Copy().defaultview;
dv.RowFilter = "score >" + thisScore;//thisScore是当前这个用户的分数
那么他的排名
int userOrder = dv.count+1;

#4


这确实是个烦人的问题,DataRow偏偏就没有行号属性~~ 郁闷~~

如果这个table是绑定在DataGrid上就比较好办
DataGrid.Items[???].DataSetIndex 可取得该行的行号

否则
DataView dv = datatable.Copy().defaultview;
dv.RowFilter = "score >" + thisScore;//thisScore是当前这个用户的分数
那么他的排名
int userOrder = dv.count+1;

#5


使用DataGrid也解决不了问题,如果只要排一次,遍历是肯定要有的!
但现在我的情况是:
假设一个公司有部门A、部门B等,而整个公司里的人只分类别C、类别D两种,各部门都有这两种人,同一个人只可能属于其中的一个部门,只属于其中的一种类别

最终要得到是所有用户的如下数据:

用户 分数 公司排名 在公司内所在类别的排名 所在部门的排名 在部门内所在类别的排名

有四五千人,如果全部遍历效率相当之低!
最好是能把每一类的所有排名全部排好,然后只遍历总表一次,其它排名去排好的数据集里定位取出排名数,这样可以提高效率!

用户表User(用户、组织机构ID、类别)
组织机构表Org(组织机构ID、所在部门ID)
分数表Score(用户、分数)

大家帮忙出点主意,主要是后两个排名比较麻烦!

#6


UP

#7


dataset(table).rows(行号).items(列号或列名)

#8


#9


有没有好的解决方案啊! 请大家帮忙想点办法

#10


????

#11


郁闷

#12


可以使用這個自動顯示名次呀:
<asp:TemplateColumn>
<HeaderTemplate>
名次
</HeaderTemplate>
<ItemTemplate>
<div align="center"><strong><%#this.dgNewsList.CurrentPageIndex * this.dgNewsList.PageSize + Container.ItemIndex+ 1%>.</strong></div>
</ItemTemplate>
</asp:TemplateColumn>

#13


可我并不是要显示所有排名,而是要把四种类型的排名数据高效率地取出来

#14


最终要得到是所有用户的如下数据:

用户 分数 公司排名 在公司内所在类别的排名 所在部门的排名 在部门内所在类别的排名

#1


如果用排序呢?然后直接取行号

#2


你形成的DATASET肯定要在DATAGRID或其他的东西里显示呀,譬如你在DATAGRID显示的话,你给DATAGRID加一个行号就性了呀
private DataTable GetRowNumberTable(DataTable dt){
   DataColumn col = new DataColumn("RowNumber",Type.GetType("System.Int32"));
   dt.Columns.Add(col);
   for(int i = 0;i<=dt.Rows.Count-1;i++){
    if(0 == i) 
     dt.Rows[i][col] = 1;
    else 
     dt.Rows[i][col] = Convert.ToInt32(dt.Rows[i-1][col]) +1;
   }
   return dt;
  }

#3


DataView dv = datatable.Copy().defaultview;
dv.RowFilter = "score >" + thisScore;//thisScore是当前这个用户的分数
那么他的排名
int userOrder = dv.count+1;

#4


这确实是个烦人的问题,DataRow偏偏就没有行号属性~~ 郁闷~~

如果这个table是绑定在DataGrid上就比较好办
DataGrid.Items[???].DataSetIndex 可取得该行的行号

否则
DataView dv = datatable.Copy().defaultview;
dv.RowFilter = "score >" + thisScore;//thisScore是当前这个用户的分数
那么他的排名
int userOrder = dv.count+1;

#5


使用DataGrid也解决不了问题,如果只要排一次,遍历是肯定要有的!
但现在我的情况是:
假设一个公司有部门A、部门B等,而整个公司里的人只分类别C、类别D两种,各部门都有这两种人,同一个人只可能属于其中的一个部门,只属于其中的一种类别

最终要得到是所有用户的如下数据:

用户 分数 公司排名 在公司内所在类别的排名 所在部门的排名 在部门内所在类别的排名

有四五千人,如果全部遍历效率相当之低!
最好是能把每一类的所有排名全部排好,然后只遍历总表一次,其它排名去排好的数据集里定位取出排名数,这样可以提高效率!

用户表User(用户、组织机构ID、类别)
组织机构表Org(组织机构ID、所在部门ID)
分数表Score(用户、分数)

大家帮忙出点主意,主要是后两个排名比较麻烦!

#6


UP

#7


dataset(table).rows(行号).items(列号或列名)

#8


#9


有没有好的解决方案啊! 请大家帮忙想点办法

#10


????

#11


郁闷

#12


可以使用這個自動顯示名次呀:
<asp:TemplateColumn>
<HeaderTemplate>
名次
</HeaderTemplate>
<ItemTemplate>
<div align="center"><strong><%#this.dgNewsList.CurrentPageIndex * this.dgNewsList.PageSize + Container.ItemIndex+ 1%>.</strong></div>
</ItemTemplate>
</asp:TemplateColumn>

#13


可我并不是要显示所有排名,而是要把四种类型的排名数据高效率地取出来

#14


最终要得到是所有用户的如下数据:

用户 分数 公司排名 在公司内所在类别的排名 所在部门的排名 在部门内所在类别的排名