【问题标题】:Min ID group by column in another tableMin ID group by column in another table
【发布时间】:2017-05-29 08:26:30
【问题描述】:

我认为这很简单,但是我无法使用分区或分组方式让它工作。我需要获取两个暗键中较低的一个,但是我仍然需要获取区域暗键,因为我在此子查询之外的另一部分查询中使用它。

    SELECT 
ac.ACCOUNT_DIM_KEY,
iid.CUST_ID,
ter.TERRITORY_DIM_KEY,
ROW_NUMBER() OVER (PARTITION BY iid.CUST_ID ORDER BY ac.ACCOUNT_DIM_KEY) AS MIN_ACCT_KEY
FROM   DEXODS.OPUB_MDM_CCV_ID iid,
       DEXWHS.D_ACCOUNT_VEEVA ac,
       DEXWHS.D_TERRITORY ter
WHERE  ac.IMS_ID = iid.VAL_1_ID
AND    SUBSTR(ac.PRIMARY_TERRITORY, 1, 8) = ter.TERRITORY_CODE
AND    ac.ACTIVE_FLAG = 'Y' 
AND    iid.SCNDY_ID_TYP_XID = 202325 
AND    iid.cust_id = '53050249'
AND    MIN_ACCT_KEY= 1

我想要的结果是只返回帐户暗键 307070 ACCOUNT_DIM_KEY CUST_ID TERRITORY_DIM_KEY MIN_ACCT_KEY 307070 53050249 -3 1
2565820 53050249 43 2

非常感谢任何帮助!

【问题讨论】:

  • 你会输入样本数据吗
  • ACCOUNT_DIM_KEY CUST_ID TERRITORY_DIM_KEY 2565820 53050249 43 307070 53050249 -3 我想要的结果是只返回 account_dim_key 307070(抱歉,这包含在所附图片中)
  • 但是你会选择哪个区域的暗键:43 还是 -3?
  • 哪个 RDBMS? SQL Server、oracle、postgresql、Mysql?如果数据库支持窗口函数,那么您将使用ROW_NUMBER() (PARTITION BY iid.CUST_ID, ORDER BY ac.ACCOUNT_DIM_KEY),然后选择 where that = 1。如果不支持,您将执行子查询以找到最小值 account_dim_key,然后返回相关以获取其余详细信息记录
  • @Matt 我更新了代码以使用行号分区但是,当我尝试添加 where min_acct_key = 1 时,我得到一个无效的标识符错误。我也尝试将其作为 subqery,但得到相同的错误。这是在 oracle 数据库中。我错过了什么?

标签: sql group-by min


【解决方案1】:

这是你想要的吗?

SELECT ac.ACCOUNT_DIM_KEY AS ACCOUNT_DIM_KEY,
       iid.CUST_ID
       ter.TERRITORY_DIM_KEY
FROM DEXODS.OPUB_MDM_CCV_ID iid JOIN
     DEXWHS.D_ACCOUNT_VEEVA ac
     ON ac.IMS_ID = iid.VAL_1_ID JOIN
     DEXWHS.D_TERRITORY ter
     ON substr(ac.PRIMARY_TERRITORY, 1, 8) = ter.TERRITORY_CODE
WHERE ac.ACTIVE_FLAG = 'Y' AND
      iid.SCNDY_ID_TYP_XID = 202325 AND
      iid.cust_id = '53050249'
ORDER BY ac.ACCOUNT_DIM_KEY
FETCH FIRST 1 ROW ONLY;

注意:FETCH FIRST 1 ROW ONLY 是 ANSI 标准 SQL。在某些数据库中,这被拼写为LIMIT,或TOP 1,或者更神秘的方式。

【讨论】:

    【解决方案2】:
    ;WITH cte AS (
        SELECT 
           ac.ACCOUNT_DIM_KEY,
           iid.CUST_ID,
           ter.TERRITORY_DIM_KEY,
           ROW_NUMBER() OVER (PARTITION BY iid.CUST_ID ORDER BY ac.ACCOUNT_DIM_KEY) AS MIN_ACCT_KEY
        FROM
           DEXODS.OPUB_MDM_CCV_ID iid
           INNER JOIN DEXWHS.D_ACCOUNT_VEEVA ac
           ON ac.IMS_ID = iid.VAL_1_ID
           AND ac.ACTIVE_FLAG = 'Y'
           INNER JOIN DEXWHS.D_TERRITORY ter
           ON SUBSTR(ac.PRIMARY_TERRITORY, 1, 8) = ter.TERRITORY_CODE
    WHERE
        iid.SCNDY_ID_TYP_XID = 202325 
        AND    iid.cust_id = '53050249'
    )
    
    SELECT *
    FROM
        cte
    WHERE
        MIN_ACCT_KEY= 1
    

    根据您在此处所写的内容,可以为任意数量的客户执行此操作,只需删除 iid.cust_id = '53050249' 即可为每位客户获取正确的行。请注意,这是使用显式连接而不是隐式连接语法。更新后的唯一错误是尝试在 where 语句中引用 ROW_NUMBER() 的列别名。如果不将原始查询包装为派生表或公用表表达式,您将无法使用该别名和列。我已经展示了公用表的表达方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-19
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多