SQL选择与连接列不同

Posted

技术标签:

【中文标题】SQL选择与连接列不同【英文标题】:SQL select distinct from a concatenated column 【发布时间】:2020-11-19 19:35:04 【问题描述】:

这个查询几乎可以满足我的要求

SELECT staging.dbo.ITEM_CODES.ITEM_CODE, MAX(dbo.OC_VDAT_AUX.UDL40) AS SAMPLEDATE,
           CONCAT(RTRIM(dbo.OC_VDATA.UDL1), RTRIM(dbo.OC_VDATA.UDL6)) as LinkID
FROM dbo.OC_VDATA 
    INNER JOIN dbo.OC_VDAT_AUX ON dbo.OC_VDATA.PARTNO = dbo.OC_VDAT_AUX.PARTNOAUX AND dbo.OC_VDATA.DATETIME = dbo.OC_VDAT_AUX.DATETIMEAUX 
    INNER JOIN stagingPLM.dbo.ITEM_CODES ON LEFT(dbo.OC_VDATA.PARTNO, 12) = staging.dbo.ITEM_CODES.SPEC_NO 
    AND LEFT(dbo.OC_VDAT_AUX.PARTNOAUX, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO 
    INNER JOIN stagingPLM.dbo.PLANTS ON dbo.OC_VDATA.UDL1 = staging.dbo.PLANTS.PLANT_CODE
WHERE  (CONVERT(DATETIME, dbo.OC_VDAT_AUX.UDL40) > DATEADD(day, - 30, GETDATE()))
GROUP BY CONCAT(RTRIM(dbo.OC_VDATA.UDL1), RTRIM(dbo.OC_VDATA.UDL6)),staging.dbo.ITEM_CODES.ITEM_CODE

查询生成的示例表:

我试图实现的最终结果是每个唯一 LinkID 的最新 ITEM_CODE 请注意表中的第一行和最后一行。最后一行不应被查询拉出。 如何修改此查询以实现这一点? 我在 select 和 where 语句中尝试了 DISTINCT 和子查询的各种位置。

【问题讨论】:

不要按项目代码分组。 【参考方案1】:

我会在你的情况下使用ROW_NUMBER 窗口函数和CTE

解决办法可以是这样的:

WITH FilterCTE AS
(
    SELECT staging.dbo.ITEM_CODES.ITEM_CODE, MAX(dbo.OC_VDAT_AUX.UDL40) AS SAMPLEDATE,
               CONCAT(RTRIM(dbo.OC_VDATA.UDL1), RTRIM(dbo.OC_VDATA.UDL6)) AS LinkID,
               ROW_NUMBER() OVER (PARTITION BY CONCAT(RTRIM(dbo.OC_VDATA.UDL1), RTRIM(dbo.OC_VDATA.UDL6)) ORDER BY MAX(dbo.OC_VDAT_AUX.UDL40)) AS RowNumber
    FROM dbo.OC_VDATA 
        INNER JOIN dbo.OC_VDAT_AUX ON dbo.OC_VDATA.PARTNO = dbo.OC_VDAT_AUX.PARTNOAUX AND dbo.OC_VDATA.DATETIME = dbo.OC_VDAT_AUX.DATETIMEAUX 
        INNER JOIN stagingPLM.dbo.ITEM_CODES ON LEFT(dbo.OC_VDATA.PARTNO, 12) = staging.dbo.ITEM_CODES.SPEC_NO 
        AND LEFT(dbo.OC_VDAT_AUX.PARTNOAUX, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO 
        INNER JOIN stagingPLM.dbo.PLANTS ON dbo.OC_VDATA.UDL1 = staging.dbo.PLANTS.PLANT_CODE
    WHERE  (CONVERT(DATETIME, dbo.OC_VDAT_AUX.UDL40) > DATEADD(day, - 30, GETDATE()))
    GROUP BY CONCAT(RTRIM(dbo.OC_VDATA.UDL1), RTRIM(dbo.OC_VDATA.UDL6)),staging.dbo.ITEM_CODES.ITEM_CODE
)
SELECT *
FROM FilterCTE
WHERE RowNumber = 1

【讨论】:

太棒了,完美的正是我所需要的。我以前从未使用过 CTE 和 ROW_NUMBER,但我当然希望我有 :-)

以上是关于SQL选择与连接列不同的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从同一个表(实际上是同一列)中选择两行,基于与其他表的连接

如何在sqlalchemy中选择多列连接的特定列?

一个表上具有不同列的 SQL 连接

tableau怎么与sql连接

从两个大表的连接中选择不同的值

如何使用 SQL Server 连接选择中的所有列