改写ITPUB newkid的求解数独DuckDB SQL为Clickhouse格式

主要包括

1.将CTE表d改写成非递归形式,其实d单独执行是可以的,不知何故,一个SQL中有两个递归时,非要说它不是递归的

2.将整除符号//改为Floor(除法),//在Clickhouse中表示注释

3.改写左移位运算符<<为bitShiftLeft,并强制转换参数为Int128和Int。

4.有的子查询表没有别名,用set joined_subquery_requires_alias = 0;避免报错,加上别名更保险

5.按位与&符号改为bitAnd函数

sql 复制代码
WITH recursive b as(
--select '53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79' b),
--select '..1....68..85...1..9....4..8..........36......7..9.2...5...7.......457.....1...3.' b),
--select '8..........36......7..9.2...5...7.......457.....1...3...1....68..85...1..9....4..' b),
select '9......4..5..2........1......69..1........5.24..7......1....3.....6...9....4.....' b),
--select '..69..1........5.24..7......1....3.....6...9....4.....9......4..5..2........1....' b),
--select '4..7.......69..1........5.2.1....3.....6...9....4.....9......4..5..2........1....' b),

d(z, lp) AS (
  --  select'1', 1
  --  UNION ALL SELECT
  --  CAST(lp+1 AS TEXT), lp+1 FROM d WHERE lp<81
-- UNION query d (z, lp) AS (SELECT '1', 1 UNION ALL SELECT CAST(lp + 1, 'TEXT'), lp + 1 FROM d WHERE lp < 81) is not recursive: While executing RecursiveCTESource. (LOGICAL_ERROR)

select number::text ,number from numbers(1,81)
  ),
grid AS (
SELECT lp                                                   AS pos
      ,Floor((lp-1)/9)::Int                                      AS r  
      ,(lp-1)%9  ::Int                                        AS c  
      ,Floor((lp-1)/27)*3 ::Int+ Floor((lp-1)%9/3)::Int AS g  
  FROM d
)
,all_pos AS (  
SELECT pos,n
      ,bitShiftLeft(1::Int128,(grid.r*9+n-1)::Int) AS r
      ,bitShiftLeft(1::Int128,(grid.c*9+n-1)::Int) AS c
      ,bitShiftLeft(1::Int128,(grid.g*9+n-1)::Int) AS g
  FROM grid,(SELECT lp n FROM d where lp<=9)as m
)
,t(s,rs,cs,gs,next_pos) AS (
SELECT CAST(ANY_VALUE(b) AS text)
       ,SUM(all_pos.r) rs   ---------- 哪些位置已经被占用
       ,SUM(all_pos.c) cs
       ,SUM(all_pos.g) gs
       ,INSTR(ANY_VALUE(b),'.')  
   FROM all_pos,b
  WHERE SUBSTR(b,all_pos.pos,1)=cast(all_pos.n as text)
  UNION ALL
  SELECT SUBSTR(t.s,1,t.next_pos-1)||a.n||SUBSTR(t.s,t.next_pos+1)
        ,t.rs+a.r
        ,t.cs+a.c
        ,t.gs+a.g
        ,case INSTR(SUBSTR(t.s,t.next_pos+1),'.') when 0 then 0 else INSTR(SUBSTR(t.s,t.next_pos+1),'.')+t.next_pos end
    FROM t
        ,all_pos a
   WHERE t.next_pos = a.pos
         AND bitAnd(t.rs,a.r)=0
         AND bitAnd(t.cs,a.c)=0
         AND bitAnd(t.gs,a.g)=0
)
--select count() from t;
--select next_pos,count() from t group by next_pos;
SELECT t.s FROM t WHERE next_pos=0;

执行结果如下

复制代码
:) \i nkdsudokuck.txt

   ┌─s─────────────────────────────────────────────────────────────────────────────────┐
1. │ 932567841157824963648319725576982134893146572421753689714298356285631497369475218 │
   └───────────────────────────────────────────────────────────────────────────────────┘

1 row in set. Elapsed: 2.562 sec. Processed 4.79 million rows, 699.22 MB (1.87 million rows/s., 272.95 MB/s.)
Peak memory usage: 244.68 MiB.
相关推荐
杨运交2 小时前
[060][调度模块]Redisson vs Redis 原生锁:两种分布式锁实现深度对比
数据库·redis·分布式
FungLeo2 小时前
Node 后端实战 · 列表查询到底怎么写?一个通用 DSL 封装,过滤分页排序一次搞定
数据库·node.js·serverless·dsl 封装·通用列表查询
抓蛙师3 小时前
多租户 tenant_id SQL 注入漏洞分析与应急响应报告
数据库·sql
ACP广源盛139246256733 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 私有化部署下 GSV2221 视频转换芯片机遇分析
大数据·数据库·人工智能
七牛开发者4 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j
何以解忧,唯有..5 小时前
数据库索引失效的常见情况与优化策略
数据库·sql·oracle
这个DBA有点耶6 小时前
分布式数据库到底该不该上?从判断标准到架构选型的实战思考
数据库·架构·dba
01_ice7 小时前
MySQL库和表的操作
数据库·mysql
oradh7 小时前
Oracle UNDO表空间管理维护总结
数据库·oracle·undo表空间·undo表空间管理·undo表空间管理维护
布莱克6057 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库