数据库常见问题

1055 2575
  • 全部
最热 | 最新
  • with t as( select b.* ,case when  days =lag(days) over(partition by id order by tm)  and days=1 then 'del'  end flag from( select a.* ,DATEDIFF(lead(tm,1) over(partition by id order by tm), tm) days from( select distinct id,SUBSTR(tm,1,10) tm from log )a )b ) select a.* ,DATEDIFF(end_dt, tm)+1 days from( select id,tm ,case when days=1 then lead(tm,1) over(partition by id order by tm)  end end_dt from t where flag is null  )a where end_dt is not null
  • 如果是时序数据,clickhouse 可以解决,如果是业务数据,且不怎么修改的热点数据,可以预先载入到内存数据库,如果不能用工具的话,就找找规律,只查必要的表。如果无序的随机存储的数据,先建索引,再分开查,然后联表。
  • sql    SET @rank := 0, @prev_date := NULL; SELECT     customer_id,     MIN(login_date) AS first_login_date,     DATEDIFF(MAX(login_date), MIN(login_date)) + 1 AS consecutive_days FROM (     SELECT         customer_id,         login_date,         @rank := IF(@prev_date IS NULL OR DATEDIFF(login_date, @prev_date) != 1, 1, @rank + 1) AS rank,         @prev_date := login_date     FROM login_info     ORDER BY customer_id, login_date ) AS subquery GROUP BY customer_id, rank;     这代码先给每行打 rank 标记,按 customer_id 和 login_date 分组求最早日期和连续天数 。
  • 生活就像一杯茶,不会苦一辈子,但总会苦一阵子。无论遇到什么困难,都要相信,风雨过后总会有彩虹。每一次跌倒,都是为了更好地站起来;每一次失败,都是为了更接近成功。别让昨天的泪水,打湿今天的阳光。保持微笑,勇敢前行,你比自己想象的更强大!🌞💪
  • 临时方案一般就是开窗函数去算了,很多大佬写的都很效率。实际如果是以数据工程来看的话,引入olap数据库,比如clickhouse,Doris,加上合理的数据分层建模,会是一个长期的解决方案
  • 信我敲给ai,一下子就出来了
  • 建立索引的主要目的有以下几点: 1. 提高查询效率:索引能够使数据库系统不必扫描整个表,而是直接定位到需要查找的数据,从而大大提高查询效率。 2. 提升数据检索速度:通过创建索引,可以让数据库系统在处理查询和获取数据时更加高效,尤其是在处理大量数据时,索引可以显著提高数据的检索速度。 3. 实现数据的唯一性:通过创建唯一性索引,可以保证数据表中每一行数据的唯一性,防止数据出现重复。 4. 加速表和表之间的连接:对于经常需要联接的列,可以创建索引来提高连接的速度。 5. 提高排序和分组的速度:索引能够显著提高数据排序和分组的速度。 需要注意的是,虽然索引可以提高查询效率,但是索引本身也需要占用存储空间,而且在插入、删除和更新数据时,索引也需要进行相应的维护,这可能会影响到数据的插入、删除和更新的速度。因此,在创建索引时,需要根据实际情况进行权衡。
  • with t1 as -- 分组排序 ( select user_id,login_date,**ROW_NUMBER**() over(partition by user_id order by login_date) as num from user_login ) ,t2 as -- 用等差数列分组(核心步骤) ( select user_id,**min**(login_date) min_date,**max**(login_date) max_date,**count**(*) date_num from t1 group by user_id,**date_sub**(login_date,**INTERVAL** num day) ) ,t3 as -- 分组排序 ( select user_id,max_date,date_num,**row_number**() over(partition by user_id order by date_num desc) ranks from t2 ) select t3.user_id, (select distinct user_name from user_login ul where ul.user_id = t3.user_id) user_name, t3.max_date, t3.date_num from t3 where ranks = 1 -- 取结果 ; 参考大佬们的思路交作业
  • 数据库调优无非就是那几方面
  • 30 张表都是同样的数据,相当于 30 张分表? 还是 30 张表有关联关系? 场景都没描述清楚! 从一亿条记录的表里找到一条数据,属于精确查找,根据查找条件,增加 hash 索引,查询时间一定是常量。 最好用分区表。
  • sql 已经有大佬写了。 我补充一条,实际工作中的复杂运算或数据量大的时候尽量不要用 sql,特别是不要用生产库。实际遇上这种需求,更好的办法是提取 userid 和登录日期到本地或中台后,写个简单方法按 userid 做遍历即可,数据量大的情况下还可以开多线程。 有点跑题哈,不过实际工作中有很多问题,其实都是跳出 sql 会有更多解决方法,数据库就是数据库,别给它加太多负载比较好。
  • 看到这个问题本来想骂人的,看了下提问者原来是 21 届的学生,就算了。
  • Hive 下测试 SQL ,customer 表,字段 id,dt select id, sub, count(*) cnt , min(dt) from  ( select    id, dt,  date_sub(dt, row_number() over(partition by id order by dt))  sub from customer ) T group by id, sub having cnt >= 2
  • 文字描述吧,一样好理解 1,rank 窗口函数,按客户 id 分组,日期排序 2,日期-上一步的 rank 值,对这个结果 group by,个数大于 1 表示连续登陆,取 count(distinct 日期)和 min(日期)
  • 先 row_number 排序,登陆日期减排序求连续标记,然后按照客户号和分组标记求最小日期和最大日期,最后计算出连续天数,oracle 实现如图
  • 首先同意一楼说法,没有十年脑血栓,不会提这种需求 其次:我在仓库干的比较久,我的思路就是,基于 linux 或者 widows 都可以,用 shell python 都可以生成 30 条基本查询,封装 30 个小脚本,开 30 个窗口,才 30 张表并发小 case 了,有时候最简单粗暴的办法反而最快,有时间去想办法,都简单粗暴搞完了
  • 钱少,低端! 钱多,中端! 钱更多,高端! 哈哈哈,呵呵呵!
  • 以前觉得挣钱不重要 后来才知道 星辰和大海都需要门票 诗和远方的路费都很贵 为了让更多的期望成现实 我们需要一份工作 这样先苦后甜才有意 义
  • 读写分离,分库分表,数据库优化,方式很多,都可以提高数据库的高性能