使用sql中的“从平均值计算”更新所有列行

使用sql中的“从平均值计算”更新所有列行,sql,arrays,sqlite,Sql,Arrays,Sqlite,我有一个数组,它从数据库中的列中获取值 String sql1 = "SELECT COUNT(DISTINCT Total) AS Rank FROM class1 s1 JOIN class1 s2 ON (s1.Total <= s2.Total) GROUP BY s1.ID ORDER BY s1.Name ASC"; pst = conn.prepareStatement(sql1); rs = pst.executeQuery(); ArrayList<Strin

我有一个数组,它从数据库中的列中获取值

String sql1 = "SELECT COUNT(DISTINCT Total) AS Rank FROM class1 s1 JOIN 
class1 s2 ON (s1.Total <= s2.Total) GROUP BY s1.ID ORDER BY s1.Name ASC";

pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();

ArrayList<String> marks = new ArrayList<>();

while (rs.next()) { 
    marks.add(rs.getString(1));
}   

String[] order = new String[marks.listIterator().nextIndex()];
order = marks.toArray(order);
但当我尝试时,我的桌子是这样的:

| NAME  | SCORE 1 | SCORE 2 | TOTAL  | POSITION  | 
--------+---------+---------+--------+-----------+
| james |   10.0  |   24.0  |  34.0  |   [1,2,3] | 
| jimmy |   10.0  |   20.0  |  30.0  |   [1,2,3] | 
| josh  |   10.0  |   19.0  |  29.0  |   [1,2,3] |  
这是我编写的用数组更新“位置列”的代码

String sql1="SELECT COUNT(DISTINCT Total)AS Rank from class1 s1 JOIN class1 
s2 on(s1.Total<=s2.Total) GROUP BY s1.ID order by s1.Name ASC";
pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();

ArrayList<String> marks = new ArrayList<>();

while (rs.next()) { 
    marks.add(rs.getString(1));
}

String[] order = new String[marks.listIterator().nextIndex()];
order = marks.toArray(order);

String sql = "update class1 set Position ='"+Arrays.toString(order)+"'"; 
pst = conn.prepareStatement(sql);
pst.execute();
String sql1=“选择COUNT(DISTINCT Total)作为class1 s1 JOIN class1中的秩

s2 on(s1.Total您希望为不同的行设置单独的值,但语句

String sql = "update class1 set Position ='"+Arrays.toString(order)+"'";
将为所有行的Position列设置相同的值,此处为数组。toString(order)
将给出值
[1,2,3]
,因此表的最终结果是所有列的Position列都具有值
[1,2,3]

为了正确地更新各行,我们需要传递每行的唯一标识符来更新位置

伪代码:

Together with the Rank count in your select query, select unique id for each row, with the help of unique_id for each row only we will be able to update the exact row in the table. Please modify the column names matching to your table declaration

String sql1 = SELECT COUNT(DISTINCT s2.Total) AS Rank from class1 s1 
JOIN class1 s2 on (s1.Total<=s2.Total)
GROUP BY s1.ID order by s1.Name ASC;

pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();

String sql = "";
while (rs.next()) { 
    String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1);
    pst = conn.prepareStatement(sql);
    pst.execute();
}
与select查询中的秩计数一起,为每一行选择唯一id,借助每一行的唯一id,我们将能够更新表中的确切行。请修改与表声明匹配的列名
字符串sql1=选择COUNT(DISTINCT s2.Total)作为class1 s1的秩

加入(s1)上的class1 s2。非常感谢你Clement Amarnath…你的解决方案是正确的。我只需将update语句中的值从1更改为2,从0更改为1。 第一个是:

String sql = "update class1 set Position ='"+rs.getString(1)+"'"+"WHERE unique_id="+rs.getString(0); 
    pst = conn.prepareStatement(sql);
    pst.execute();
sqlite3似乎有一种不同的索引默认行的方法…所以我改变了这种方法

String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1); 
    pst = conn.prepareStatement(sql);
    pst.execute();

非常感谢。祝您好运..

您使用的是哪种dbms?我使用的是带netbeans的sqlite3 ideSQLite不支持数组。非常感谢您Clement..我已经修改了表名,但仍然得到一个异常,即..“java.sql.SQLException:列0超出范围[1,2]“。是否有办法解决此问题。唯一的修改是在sql select语句中,它的-count(DISTINCT s2.Total)作为秩-。因此,创建计算列(秩)的语句将是:String sql1=select count(DISTINCT s2.Total)作为等级从1级s1加入1级s2(s1。Total@RodneyNart-很高兴听到答案帮助您解决了问题,我也根据您的评论修改了答案。但是,是否有办法将字符串变量附加到更新列中的值,以便在位置列中,我的结果类似于“1”、“2”、“3”、“4”…而不是1,2,3,4
String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1); 
    pst = conn.prepareStatement(sql);
    pst.execute();