创建缺少键值数据记录的视图

Posted

技术标签:

【中文标题】创建缺少键值数据记录的视图【英文标题】:Creating view with missing data records for key values 【发布时间】:2021-06-11 08:11:02 【问题描述】:

我们有一个包含一些行的表。 我们想创建一个缺少关键列行的视图,并使用最后可用的值填充其他非关键值。

关键列 - 名称、年份和期间。 如果丢失了,我们必须根据以前可用的键集来填充薪水。

表格中的当前数据:

预期数据集:

在这里,以绿色突出显示的行是基于附加的,并且使用最后一个可用的键集填充值。

请求:

知道如何创建视图 我试过了,但没有看到预期的数据。

这是我尝试过的

WITH “EMP”
AS (
  SELECT DISTINCT EMPLOYEE
  FROM EMP_TBL
  )
  ,"QTR"
AS (
  SELECT 'Q1' QUARTER
  
  UNION ALL
  
  SELECT 'Q2' QUARTER
  
  UNION ALL
  
  SELECT 'Q3' QUARTER
  
  UNION ALL
  
  SELECT 'Q4' QUARTER
  )
  ,"YR"
AS (
  SELECT '2015' "YEAR"
  
  UNION ALL
  
  SELECT '2016' "YEAR"
  
  UNION ALL
  
  SELECT '2017' "YEAR"
  
  UNION ALL
  
  SELECT '2018' "YEAR"
  
  UNION ALL
  
  SELECT '2019' "YEAR"
  
  UNION ALL
  
  SELECT '2020' "YEAR"
  
  UNION ALL
  
  SELECT '2021' "YEAR"
  )
  ,”EMP_Y_QTR"
AS (
  SELECT EMPLOYEE
    ,YEAR
    ,QUARTER
  FROM “EMP”
  CROSS JOIN "QTR"
  CROSS JOIN "YR"
  )
  ,"CURR_DATA"
AS (
  SELECT DISTINCT EMPLOYEE
    ,YEAR
    ,QTR
    ,'Y' FLAG
  FROM EMP_FACT_TABLE
  )
  ,"REF_DATA"
AS (
  SELECT A.EMPLOYEE
    ,A.YEAR
    ,A.QUARTER
    ,B.YEAR AS YEAR_TO_BE_APPLIED
    ,B.QTR AS QTR_TO_BE_APPLIED
    ,B.FLAG
  FROM EMP_Y_QTR A
  LEFT JOIN "CURR_DATA" B ON A.EMPLOYEE = B.EMPLOYEE
    AND A.YEAR = B.YEAR
    AND A.QUARTER = B.QTR
  )
  ,REF_DATA_PROC
AS (
  SELECT *
    ,COALESCE(YEAR_TO_BE_APPLIED, (
        LAG(YEAR_TO_BE_APPLIED) OVER (
          ORDER BY EMPLOYEE
            ,YEAR
            ,QUARTER
          )
        ), (
        LEAD(YEAR_TO_BE_APPLIED) OVER (
          ORDER BY EMPLOYEE
            ,YEAR
            ,QUARTER
          )
        )) AS YEAR_APPLY
    ,COALESCE(QTR_TO_BE_APPLIED, (
        LAG(QTR_TO_BE_APPLIED) OVER (
          ORDER BY EMPLOYEE
            ,YEAR
            ,QUARTER
          )
        ), (
        LEAD(QTR_TO_BE_APPLIED) OVER (
          ORDER BY EMPLOYEE
            ,YEAR
            ,QUARTER
          )
        )) AS QUARTER_APPLY
  FROM REF_DATA T
  )
  ,EMP_FACT_TABLE_DATA
AS (
  SELECT DISTINCT [EMPLOYEE]
    ,[CITY]
    ,[YEAR]
    ,[QTR]
    ,[ADDRESS]
    ,[SALARY]
      FROM [EMP_FACT_TABLE]
  )
SELECT [EMPLOYEE]
    ,[CITY]
    ,[YEAR]
    ,[QTR]
    ,[ADDRESS]
    ,[SALARY]
FROM REF_DATA_PROC B
LEFT JOIN EMP_FACT_TABLE_DATA A ON A.EMPLOYEE = B.EMPLOYEE
  AND B.YEAR = A.YEAR
  AND B.QUARTER = A.QTR
WHERE A.EMPLOYEE = B.EMPLOYEE
  AND B.YEAR_APPLY = A.YEAR
  AND B.QUARTER_APPLY = A.QTR
  
  
  
  
  
  
  
  

【问题讨论】:

您的表格未反映您所说的内容,某些行已更改。 我已经更新了数据集,你现在可以检查一下吗。 数据图像不能帮助我们帮助您;花时间将其发布为 DDL 和 DML 语句。另外,到目前为止,尝试了什么?为什么它不起作用? 你需要的是一个日历维度表。 你好@Larnu,我已经添加了我尝试过的查询。你能帮我解决这个查询吗?我没有看到填充缺失年份的数据,所以请求 【参考方案1】:

您可以通过评估一个不同的名称和句点列表来实现,交叉连接它,然后左连接您的初始表 - 但是,根据数据量,这将需要相当长的时间,因为交叉连接通常不是t 选择的工具...无论如何,这里是一个例子:

DECLARE @t TABLE(cName varchar(10), cYear int, cPeriod char(2), cSalary int)

INSERT INTO @t VALUES
('Mark', 2019, 'Q1', 100)
,('Mark', 2019, 'Q2', 200)
,('Mark', 2019, 'Q4', 400)
,('Mark', 2020, 'Q1', 500)
,('Mark', 2020, 'Q3', 600)
,('Mark', 2020, 'Q4', 480)


;WITH ctePeriods AS(
SELECT DISTINCT t.cYear, p.cPeriod
  FROM @t t
  CROSS JOIN (SELECT 'Q1' AS cPeriod UNION ALL SELECT 'Q2' UNION ALL SELECT 'Q3' UNION ALL SELECT 'Q4') p
),
ctePersonPeriods AS(
  SELECT DISTINCT t.cName, p.cYear, p.cPeriod
    FROM @t t
    CROSS JOIN ctePeriods p
),
cteSalary AS(
SELECT p.cName, p.cYear, p.cPeriod, t.cSalary
  FROM ctePersonPeriods p
  LEFT JOIN @t t ON t.cName = p.cName AND t.cYear = p.cYear AND t.cPeriod = p.cPeriod
 )
 SELECT cName, cYear, cPeriod, ISNULL(cSalary, LAG(cSalary) OVER (PARTITION BY cName ORDER BY cYear, cPeriod)) AS cSalary
  FROM cteSalary

【讨论】:

你好@tyron78,如果缺少2行(滞后> 1+)会起作用

以上是关于创建缺少键值数据记录的视图的主要内容,如果未能解决你的问题,请参考以下文章

此类与键视图的键值编码不兼容

Unity 2020.1.8f1 无法构建 xcode 项目,因为缺少 plist 键值对

选择某些键值相同的数据库记录

iOS 此类不符合键标签的键值编码

MyBatis应用记录:MyBatis如何得到插入数据之后的主键值

利用GeneratedKeyHolder获得新建数据主键值