【问题标题】:How would I translate this array mapping transformation to SQL?我如何将此数组映射转换转换为 SQL?
【发布时间】:2019-12-16 12:52:01
【问题描述】:

假设我有以下几行:

const rows = [
  { contract: "HC003", type: "Regular" },
  { contract: "HC005", type: "NOT-Regular" },
  { contract: "HC006", type: "NOT-Regular" },
  { contract: "HC007", type: "NOT-Regular" },
  { contract: "HC008", type: "Regular" },
  { contract: "HC015", type: "NOT-Regular" },
  { contract: "HC016", type: "Regular" }
];

每一行都需要添加一个group-列。此列获取前面行的最后一行的contract 值(这意味着顺序很重要),其中type 等于Regular

在 JS 中,我会这样表达:

const findLastRegularContract = rangeEnd =>
  rows
    .slice(0, rangeEnd)
    .reverse()
    .find(row => row.type === "Regular");

const withGroups = rows.map((row, i) => ({
  ...row,
  group: findLastRegularContract(i + 1).contract
}));

这导致以下结果:

[
  { contract: "HC003", type: "Regular", group: "HC003" },
  { contract: "HC005", type: "NOT-Regular", group: "HC003" },
  { contract: "HC006", type: "NOT-Regular", group: "HC003" },
  { contract: "HC007", type: "NOT-Regular", group: "HC003" },
  { contract: "HC008", type: "Regular", group: "HC008" },
  { contract: "HC015", type: "NOT-Regular", group: "HC008" },
  { contract: "HC016", type: "Regular", group: "HC016" }
]

我将如何在 SQL 查询中执行此数据转换? 有没有办法在 SQL 中的行上“映射”?或者是否有一种声明/惯用的方式来实现相同的结果?

编辑:有两个额外的列可以帮助保持适当的排序,即:

  • valid from
  • valid to

【问题讨论】:

    标签: sql sql-server mapping sequence transformation


    【解决方案1】:

    你可以尝试使用案例

     select  case 
              when contract =  "HC003" then  "Regular" 
              when contract =  "HC003" then  "NOT-Regular"
              when contract =  "HC006" then  "NOT-Regular" 
              when contract =  "HC007" then  "NOT-Regular"
              when contract =  "HC008" then  "Regular"
              when contract =  "HC015" then  "NOT-Regular" 
              when contract =  "HC016" then  "Regular"  
            end type          
    
         , case
              when contract =  "HC003" then  "HC003" 
              when contract =  "HC003" then  "HC003"
              when contract =  "HC006" then  "HC003" 
              when contract =  "HC007" then  "HC003"
              when contract =  "HC008" then  "HC008"
              when contract =  "HC015" then  "HC008" 
              when contract =  "HC016" then  "HC008"  
            end group  
    from my_table  
    

    或者您可以将值存储在表的相应列中并连接..

    我的表

       id   contract    type        group 
       1    "HC003"   "Regular"       "HC003" 
       2    "HC005"   "NOT-Regular"   "HC003" 
       3    "HC006"   "NOT-Regular"   "HC003" 
       4    "HC007"   "NOT-Regular"   "HC003" 
       5    "HC008"   "Regular"       "HC008" 
       6    "HC015"   "NOT-Regular"   "HC008" 
       7    "HC016"   "Regular"       "HC016" 
    

    【讨论】:

      【解决方案2】:

      对原始问题的扩展是正确答案的关键,因为解决方案依赖于正确的行排序。

      这可以以声明方式执行,例如以下查询(重命名了几列):

      SELECT  
          a.contract_id, a.contract_type, a.valid_from, a.valid_to,   
          contract_group = 
              (SELECT TOP 1
                  contract_id
              FROM 
                  contracts b
              WHERE
                   b.valid_from <= a.valid_from AND b.contract_type = "Regular"
              ORDER BY b.valid_from DESC)
      FROM
          contracts a
      ORDER BY
          a.valid_from ASC
      

      希望这会有所帮助。

      【讨论】:

      • 嗯,这是一个简洁有趣的解决方案。非常感谢!
      猜你喜欢
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2019-05-12
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多