sqlite 根据列值创建有序分区,即密集等级()

标签 sql sqlite

如果有下表@

ID     VAR1
--     ----
A      YES
B      YES
C      YES
D      NO
E      YES
F      NO
G      YES
H      YES

我想创建一个新分区,其中 VAR1 在 YESNO 之间变化,如下所示:

ID     VAR1    VAR2
--     ----
A      YES     1
B      YES     1
C      YES     1
D      NO      2
E      YES     3
F      NO      4
G      YES     5
H      YES     5

显然,我可能会在 sql server 中使用 dense_rank(),但我在 sqlite 中没有看到与之等效的方法。

有人知道任何解决方法吗?

最佳答案

这在 SQLite 中很棘手,但至少它支持 CTE。这是我的想法。 。拉入先前的值(使用相关子查询)。然后根据该值的逻辑进行累积和。

with tt as (
      select t.*,
             (select t2.var1
              from t t2
              where t2.id < t.id
              order by t2.id desc
              limit 1
             ) as prev_var1
      from t
     )
select tt.*,
       (select sum(case when prev_var1 is null or prev_var1 <> var1 then 1 else 0 end)
        from tt tt2
        where tt2.id <= tt.id
       ) as var2
from tt;

这假设 - 正如问题中一样 - 顺序是由 id 列指定的。

关于sqlite 根据列值创建有序分区,即密集等级(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43171716/

相关文章:

sql - 如何计算每个员工每个日期的第一个和最后一个事件之间的差异

sql - 在 INNER JOIN SQL 查询中使用 GROUP BY 和 ORDER BY

android - 删除索引无法正常工作的SQlite Android

Java Lang 空指针异常,但我不明白为什么?

python - SQLite 中的文件锁

java - 在应用程序启动时创建 SQLite 数据库

mysql - SQL 在给定输入的变量中存储未知列名

SQL 查询 – 执行循环但使用变量数组

.net - 两个 SELECTS,一个查询

c# - 如何在 SQLite 中有条件地插入或替换一行?