行转列不再复杂:SQL高手都在用的技巧揭秘

背景

在数据分析中,我们常常需要将纵向排列的数据转换为横向展示,以便更直观地进行分析或生成报告。这个过程就是 行转列,又称为 Pivot 操作。在 SQL 中,如何将行数据高效转换为列数据是一项非常实用的技巧,无论是生成动态报表,还是在数据透视分析中应用,都能够大显身手。

在这篇博文中,我将带你从零开始,深入理解 SQL 中行转列的原理,并通过常见的数据库示例逐步展示行转列的多种实现方式。

行转列是什么

行转列操作可以帮助我们将多行数据转换成不同的列,尤其在处理 数据透视 时非常有用。行转列广泛应用于需要汇总、整理数据的场景,如报表生成和业务分析。


Rocky大约 3 分钟
Git历史记录修改用户名和邮箱
  1. 进入仓库目录,执行

    #!/bin/sh
    
    git filter-branch -f --env-filter '
    
    OLD_EMAIL="旧邮箱"
    CORRECT_NAME="新用户名"
    CORRECT_EMAIL="新邮箱"
    
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    
    git config user.name "$CORRECT_NAME"
    git config user.email "$CORRECT_EMAIL"
    ' --tag-name-filter cat -- --branches --tags
    
    
  2. 执行

    git push --force
    
  3. 如果执行1的过程中出错,可以执行下面命令后重试

    rm -rf .git/refs/original/
    git reflog expire --expire=now --all
    
    或者
    
    git update-ref -d refs/original/refs/heads/master
    
    或者
    
    git filter-branch -f --tree-filter -f 'rm -f test' -- --all
    

Rocky大约 2 分钟gitgit
PGSQL GIN索引“失效”

问题背景

现在有一张标签表,主要有两个字段,member_id和tags。如下:

create table user_tags
(
    id   serial8 primary key,
    member_id int8 not null ,
    tags jsonb
);
create index concurrently on user_tags using gin (tags);

Rocky大约 7 分钟PGSQLGIN索引PGSQLgin_clean_pending_list
GitHub Workflow突然报错

再github上跑了一个工作流,主要就是执行npm installnpm run docs:build

使用的package.json如下:

{
  "name": "my-blogs",
  "version": "2.0.0",
  "description": "my-blogs",
  "license": "MIT",
  "type": "module",
  "scripts": {
    "docs:build": "vuepress build src",
    "docs:clean-dev": "vuepress dev src --clean-cache",
    "docs:dev": "vuepress dev src"
  },
  "devDependencies": {
    "@vuepress/client": "2.0.0-beta.61",
    "@vuepress/plugin-google-analytics": "^2.0.0-beta.61",
    "vue": "^3.2.47",
    "vuepress": "2.0.0-beta.61",
    "vuepress-plugin-china-search-console": "^2.1.5",
    "vuepress-plugin-components": "2.0.0-beta.184",
    "vuepress-plugin-search-pro": "2.0.0-beta.184",
    "vuepress-theme-hope": "2.0.0-beta.184"
  }
}

Rocky大约 3 分钟
SpringBoot服务在服务启动完成前被提前注册到nacos

springboot服务在服务启动完成前提前注册到nacos,gateway拿到服务提供者信息后转发请求导致请求异常

Untitled
Untitled

上图中的例子两个时间相差3秒时间(估计因为我机子当时在做测试,cpu基本满了,导致时间相差比较大)。


Rocky大约 2 分钟nacos
数组转树形结构只需两步

已很经典的菜单为例,假设结构如下:

  • id
  • parent_id
  • name
  • xxx1
  • xxx2
  • ….

按照一比一构造一个类(只增加一个children字段):

@Data
public class XXXX{
	private Long id;

	private Long parentId;

	private String name;

	private String xxx1;

	private String xxx2;

	private List<XXXX> children;
}


Rocky大约 2 分钟树形结构
数据同步方案

CDC: Change Data Capture

  • cdc方案对比
Untitled
Untitled
Untitled
Untitled

Rocky大约 2 分钟cdc异构数据库同步cdcchange data capturemysqlpostgresqlpgsqlkafkamq异构数据库同步
K8S 无感发布

背景

问题一: 比如现在k8s有个deployment,有3个pod。此时有个请求在pod A中进行处理,假设需要耗时5分钟。在这个5分钟内,执行了k8s的滚动发布,并开始销毁这个pod。 这个场景下,如果不做一些额外配置,那么pod A的这个请求应该会处理异常。

问题二: 滚动发布的时候,k8s刚启动了一个pod,但这个pod可能需要等一段时间才能真正对外提供服务。但k8s此时开始转发请求到这个pod了,这种情况下,请求是不能成功处理的

核心问题:

  1. k8s如何知道pod可以对外提供服务了
  2. pod如何知道k8s要销毁这个pod了,pod里的应用程序知道后就能自己进行shutdown

Rocky大约 2 分钟k8sk8s无感发布
2
3
4
5
...
14









  • 随机毒鸡汤:现在看来用生日做密码,还是很安全的,毕竟没有人记得你生日。