【问题标题】:Double increment where 2nd increment reflects 1st in sql for encounter data双增量,其中第二个增量反映了 sql 中遇到数据的第一个增量
【发布时间】:2015-07-31 18:30:42
【问题描述】:

我正在构建医疗保健 837 遭遇,需要在 HL 段上设置增量。

  • C1 基于 Criteria1C2 基于 Criteria2 上的设置。
  • C2 的编号永远不会与 C1 相同,反之亦然。
  • C1 我可以使用 row_number() over(order by (select Criteria1))

这是C2 我遇到了问题。

 C1 | C2 | Criteria1 | Criteria2
  1 | 2 | ID1 | NID1
  1 | 3 | ID1 | NID2
  1 | 4 | ID1 | NID3
  5 | 6 | ID2 | NID4
  5 | 7 | ID2 | NID5
  5 | 8 | ID2 | NID6
  9 |10 | ID3 | NID7

简化查询:

 SELECT cm.Criteria1, cm.Criteria2, cj.C1 
 FROM [dbo].[TBL1] cm 
 JOIN (
         SELECT cm.Criteria1,
                row_number() over(order by (select Criteria1)) as C1 
         FROM [dbo].[TBL1] cm 
         GROUP BY cm.Criteria1) cj on cj.Criteria1 = cm.Criteria1 
 GROUP BY cm.Criteria1, cm.Criteria2, cj.C1 Order by cj.C1 

【问题讨论】:

  • 向我们展示您的代码以帮助您
  • 简化-SELECT cm.Criteria1 ,cm.Criteria2 ,cj.C1 FROM [dbo].[TBL1] cm JOIN (SELECT cm.Criteria1 ,row_number() over(order by (select Criteria1)) as C1 FROM [dbo].[TBL1] cm group by cm.Criteria1) cj on cj.Criteria1 = cm.Criteria1 Group by cm.Criteria1 ,cm.Criteria2 ,cj.C1 Order by cj.C1
  • 请添加您的 TBL1 表的定义以及它可以具有的数据示例,另外,请为示例数据添加所需的输出。
  • 您运行的是什么版本的 SQL Server?
  • 输出列在上面的 c1 和 c2 列中,其中条件 1 和 2 是更改的值。 C1 需要在 C2 停止的地方加 1。我正在使用 SQL 2014。

标签: sql auto-increment


【解决方案1】:

这似乎可行,但我没有检查很多边缘情况(开窗很有趣!):

with tbl1 as (
    select 'ID1' as Criteria1, 'NID1' as Criteria2
    union
    select 'ID1', 'NID2'
    union
    select 'ID2', 'NID4'
    union
    select 'ID2', 'NID5'
    union
    select 'ID3', 'NID7'
)

select 
    rank() over (order by Criteria1) + DENSE_ranK() OVER (ORDER BY CRITERIA1) - 1 as C1,
    rank() over (order by Criteria1) + row_number() over (partition by Criteria1 order by Criteria2) + DENSE_ranK() OVER (ORDER BY CRITERIA1) - 1 as C2,
    Criteria1,
    Criteria2
from
  tbl1

稍微分解一下:

我们将每组 Criteria1 行称为 SQL 用语中的“分区”。

因此要求是:​​

C1 总是等于所有先前分区中的行数 + 当前分区的 1 加上先前分区的数量。

C2 总是等于所有先前分区中的行数 + 当前分区的 1,加上先前分区的数量,加上分区内所有先前的行数 + 当前行的 1。

RANK() over (order by Criteria1) 为您提供所有先前分区中的行数 + 1。

DENSE_RANK() over (order by Criteria1) - 1 为您提供先前分区的数量。

ROW_NUMBER() over (partition by Criteria1 order by Criteria2) 为您提供分区中之前的行数。

【讨论】:

  • 等级和密集等级完美运行,谢谢凯尔!这对于构建 X12 数据集的任何 EDI 专家都会派上用场。
【解决方案2】:

目前还不清楚您到底想得到什么,但似乎下面就是您要寻找的:

with counts as (select count(distinct cm.criteria1) c1, count(distinct cm.criteria2) c2 from dbo.tbl1) 
select cj1.c1, cj2.c2, cm.criteria1, cm.criteria2
from dbo.tbl1 cm
inner join ( 
      select cm1.criteria1, 
         row_number() over ( order by cm1.criteria1)as c1 
      from dbo.tbl1 cm1 group by cm1.criteria1) cj1 
              on cj1.criteria1 = cm.criteria1
inner join ( 
      select cm2.criteria2, 
         (select counts.c1 from counts) + row_number() over ( order by cm2.criteria2) as c2 
      from dbo.tbl1 cm2 group by cm1.criteria2) cj2 
              on cj2.criteria2 = cm.criteria2
group by cm.criteria1, cm.criteria2, cj1.c1, cj2.c2
order by cj1.c1, cj2.c2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 2021-12-27
    • 2017-09-24
    • 2021-06-28
    • 2018-12-31
    • 1970-01-01
    • 2019-02-23
    • 2011-08-23
    相关资源
    最近更新 更多