sqlite 添加计算列并检查非重复值[已关闭]

zbdgwd5y  于 2023-03-03  发布在  SQLite
关注(0)|答案(1)|浏览(177)

4天前关闭。
Improve this question
如何使用SQL查询将名为computed_no2(INT)的计算列添加到表中?
具体来说,每当"间距"、"强度"或"速度"列的任何(一个或多个)值发生更改时,我希望在"概念"、"形式"或"SIN"列具有相同值的行中将整数值增加1。

我知道如何只在一列中查找不同的值(比如Aparature),但我在多列中遇到了问题:

UPDATE results 
SET computed_no2 = (SELECT COUNT(DISTINCT Aparature)
                    FROM results AS r 
                    WHERE r.Concept = results.Concept 
                      AND r.Form= results.Form
                      AND r.SIN= results.SIN
                      AND r.Aparature < results.Aparature) + 1
w46czmvw

w46czmvw1#

您可以通过使用窗口函数(更具体地说是DENSE_RANK)来实现排序:

SELECT
  Concept,
  Form,
  SIN,
  Aparature,
  Intensity,
  Speed,
  DENSE_RANK () OVER (
    PARTITION BY Concept, Form, SIN
    ORDER BY  Speed, Aparature, Intensity
  ) computed_no2
FROM results;

输出:
| 概念|表格|正弦|隔离|强度|速度|计算_no2|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| ABC1|盖|表格一|第二章|尖峰|一百|1个|
| ABC1|盖|表格一|第二章|尖峰|二百|第二章|
| ABC1|盖|表格二|第二章|尖峰|一百|1个|
| ABC1|盖|表格二|第二章|尖峰|一百|1个|
| CDA2基因|低|表格三|三个|模|五十|1个|
| CDA2基因|低|表格三|三个|模|五十|1个|
| CDA2基因|低|表格三|第二章|模|七十|第二章|
| CDA2基因|低|表格三|四个|模|七十|三个|
注意ORDER BY子句(在DENSE_RANK中)中字段的顺序对结果有很大的影响!我不得不尝试一下才得到您期望的顺序。
要更新这些值,将上一次查询的结果存储在临时表(我们称之为 * tmp *)中可能更容易,然后按如下所示进行更新:

UPDATE results
SET computed_no2 = (
  SELECT tmp.computed_no2
  FROM tmp
  WHERE
    results.Concept = tmp.Concept,
    results.Form = tmp.Form,
    results.SIN = tmp.SIN,
    results.Aparature = tmp.Aparature,
    results.Intensity = tmp.Intensity,
    results.Speed = tmp.Speed
);

最后可以删除临时表了!

相关问题