代码之家  ›  专栏  ›  技术社区  ›  Montaser Majid

用于从多行中提取单行的SQL查询

  •  -1
  • Montaser Majid  · 技术社区  · 2 年前

    我们之前有一个包含pinHash的用户信息表

    id号 用户ID 种子 资产类型 粉杂烩
    1. 110 a12H 比特币 q23es
    2. 111 R23 比特币 e2w12
    3. 111 y36w 以太坊 e2w12

    因此,对于相同的userId,所有资产类型的pinHash都是相同的。

    现在,我们正在迁移到另一个表

    id号 用户ID 粉杂烩
    1. 110 q23es
    2. 111 e2w12

    可以使用哪个SQL获取此迁移的所有记录,即使用pinHash获取不同的userId。

    N、 B:我已经使用spring boot进行了迁移,我从第一个表中获取所有行,然后使用HashMap在新表中只放置一行userId。尽管如此,我还是喜欢这样一个SQL,它只会产生不同的userId行。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Tim Biegeleisen    2 年前

    假设您总是希望报告最小值 id 从每组副本中,我们可以在此处使用聚合:

    SELECT MIN(id) AS id, userId, pinHash
    FROM yourTable
    GROUP BY userId, pinHash;
    
        2
  •  0
  •   RF1991    2 年前

    您的数据

    CREATE TABLE TEST(
       id        INTEGER  NOT NULL 
      ,userId    INTEGER  NOT NULL
      ,seed      VARCHAR(5) NOT NULL
      ,assetType VARCHAR(9) NOT NULL
      ,pinHash   VARCHAR(5) NOT NULL
    );
    INSERT INTO TEST
    (id,userId,seed,assetType,pinHash) VALUES 
    (1,110,'a12H','Bitcoin','q23es'),
    (2,111,'r23s','Bitcoin','e2w12'),
     (3,111,'y36w','Ethereum','e2w12');
    

    使用 Row_number 作用

    SELECT id,
           userid,
           pinhash
    FROM   (SELECT id,
                   userid,
                   seed,
                   assettype,
                   pinhash,
                   Row_number ()
                     OVER (
                       partition BY userid, pinhash
                       ORDER BY id ASC ) rn
            FROM   test) T
    WHERE  rn = 1