【问题标题】:Scenario on Selecting Records选择记录的场景
【发布时间】:2017-11-15 23:32:31
【问题描述】:

我有一个场景是从数据库中的多条记录中提取几条记录。 以下来源记录与一位帐户持有人有关。

PrimaryOrSecondary  Duplicate_Account_ID    Account_ID  START_DATE  END_DATE
------------------  --------------------  ------------  ----------  --------
Primary     1000    1000    26/05/2017    NULL

Primary     1000    1000    10/03/2014    25/05/2017

Secondary   2000    1000    26/05/2017    NULL

Secondary   3000    1000    10/03/2014    25/05/2017

在这 4 条记录中,我必须应用以下规则才能获得一条目标记录。

  1. 如果 Duplicate_Account_ID=Account_ID(那么它是 PRIMARY 记录)并且如果它的 END_DATE 为 NULL,则在目标中填充该记录,不要再看了。

  2. 如果步骤 1 中的 END_DATE 为 NULL,则转到 Duplicate_Account_IDAccount_ID 的辅助记录,查看是否有任何记录具有 NULL END_DATE。如果找到,则在目标中填充该记录。

  3. 如果在步骤 2 中未找到记录,则返回主记录并获取具有最大 START_DATE 的记录并在目标中填充该记录。

最终我需要源表中这 4 条记录中的一条记录。

任何帮助请。

【问题讨论】:

  • “填充该记录”是什么意思?用什么更新它?不清楚你在问什么。更新后表格中的值应该是什么样子?
  • 请参阅更新。谢谢。
  • 您使用的是哪个 DBMS? SQL 服务器? MYSQL?
  • SQL 服务器。谢谢。

标签: sql sql-server etl


【解决方案1】:

您尚未标记您的 DBMS,但这里是 SQL Server 解决方案

INSERT  INTO yourothertable
SELECT  TOP 1
        PrimaryOrSecondary,
        Duplicate_Account_ID,
        Account_ID,
        START_DATE,
        END_DATE
FROM    (
            SELECT  *,
                    MAX(START_DATE) OVER (PARTITION BY PrimaryOrSecondary) AS MaxDate
            FROM    yourtable
        ) a
WHERE   (Duplicate_Account_ID = Account_ID AND END_DATE IS NULL) OR
        (PrimaryOrSecondary = 'Secondary' AND Duplicate_Account_ID<>Account_ID AND END_DATE IS NULL) OR
        (PrimaryOrSecondary = 'Primary' AND MaxDate = START_DATE)
ORDER BY
        CASE
            WHEN Duplicate_Account_ID = Account_ID AND END_DATE IS NULL
            THEN 1
            WHEN PrimaryOrSecondary = 'Secondary' AND Duplicate_Account_ID<>Account_ID AND END_DATE IS NULL
            THEN 2
            WHEN PrimaryOrSecondary = 'Primary' AND MaxDate = START_DATE
            THEN 3
        END

【讨论】:

  • 谢谢。只是为了增加更多的复杂性。我有另一列名为 Type in source ,它的值如“Staff”或“Student”,我必须将其添加到 MAX 中的分区中吗?在选择前 1 名时,我还必须考虑此类型列。所以为了实现这一点,我添加了 ROW_NUMBER() OVER(PARTITION BY Account_ID, Type ORDER BY MAXDATE) 作为 RN。然后选择其中RN=1。你认为这会奏效吗?
  • 您需要使用您的查询以及您想要实现的目标来更新您的问题。此外,看看某样东西是否有效的最好方法就是尝试一下!
猜你喜欢
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多