2017-11-18 260 views
1

我有2个表,我需要使用CTE。我需要使用两个表的CTE

我需要行一组Table_2行从Table_1,这样dActiveDate是最大的table_1,并​​为table_1.dcidKala = table_2.dcidKala

CREATE TABLE #Table_1 
(
    dcidKala    INT, 
    dcPercentDiscount  FLOAT, 
    dActiveDate   DATE 
) 

CREATE TABLE #Table_2 
(
    dcRow   INT, 
    dcidKala  INT, 
    dcNum   FLOAT, 
    dDateFactor  DATE 
) 

INSERT INTO #Table_1 
    (
    dcidKala, 
    dcPercentDiscount, 
    dActiveDate 
) 
VALUES 
(109,10,'2017-08-23'), 
(109, 15, '2017-10-12'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 
    (
    dcRow, 
    dcidKala, 
    dcNum, 
    dDateFactor 
) 
VALUES 
(1,109,1, '2017-10-05' ), 
(2, 109, 2, '2017-10-07'), 
(3, 109, 1, '2017-10-14'), 
(4, 109, 5, '2017-10-19'), 
(5, 100, 2, '2017-01-25') 

;WITH cte AS 
(
    SELECT th.dcPercentDiscount, 
      tb.dcRow, 
      ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate) AS 
      rn 
    FROM #Table_1 th 
      INNER JOIN #Table_2 tb 
       ON tb.dcidKala = th.dcidKala 
       AND tb.dDateFactor >= th.dActiveDate 
) 

SELECT * 
FROM #Table_2 t2 
     LEFT JOIN cte t3 
      ON t2.dcRow = t3.dcRow 
      AND t3.rn = 1 


DROP TABLE [#Table_1] 
DROP TABLE [#Table_2] 

--result myCode is: 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 10 3 1 
    --4 109 5 2017-10-19 10 4 1 
    --5 100 2 2017-01-25 20 5 1 

    --Rows 3 and Rows 4 is wrong 

    --i need this result : 
    -- on Result From table_1 on table_2 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 15 3 1 
    --4 109 5 2017-10-19 15 4 1 
    --5 100 2 2017-01-25 20 5 1 

对于TABLE_2从TABLE_1只是一个结果,每一行是最大的 dActiveDate小dDateFactor

请帮我

谢谢

+0

您正在使用哪种[DBMS](https://en.wikipedia.org/wiki/DBMS)产品? Postgres的?甲骨文? “_SQL_”只是一种查询语言,而不是特定数据库产品的名称。 –

回答

1

您可以使用此。

;WITH cte AS 
(
    SELECT 
     th.dcPercentDiscount, tb.dcRow, 
     ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate DESC) AS rn 
    FROM 
     Table_1 th 
    INNER JOIN 
     Table_2 tb ON tb.dcidKala = th.dcidKala 
        AND tb.dDateFactor >= th.dActiveDate 
) 
SELECT * 
FROM Table_2 t2 
LEFT JOIN cte t3 ON t2.dcRow = t3.dcRow and t3.rn=1 
+0

谢谢你的回复 我测试你的代码与差异数据和不幸的是错误的.... 你能编辑它吗?sarslan? –

+0

你能分享你的不同数据吗? –

+0

我做了更新。 –

1
CREATE TABLE #Table_1 (dcidKala   INT, 
         dcPercentDiscount FLOAT, 
         dActiveDate  DATE) 

CREATE TABLE #Table_2 (dcRow  INT, 
         dcidKala INT, 
         dcNum  FLOAT, 
         dDateFactor DATE) 

INSERT INTO #Table_1 (dcidKala, 
         dcPercentDiscount, 
         dActiveDate) 
VALUES (100, 10, '2017-01-01'), 
(101, 15, '2017-01-02'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 (dcRow, 
         dcidKala, 
         dcNum, 
         dDateFactor) 
VALUES (1, 100, 1, '2017-01-05'), 
(2, 100, 2, '2017-01-09'), 
(3, 101, 1, '2017-01-01'), 
(4, 101, 5, '2017-01-20'), 
(5, 100, 2, '2017-01-25') 

SELECT * 
FROM [#Table_2] AS [t2] 
CROSS APPLY ( SELECT TOP 1 * 
       FROM ( SELECT TOP 1 [t1].[dcidKala], 
            [t1].[dcPercentDiscount], 
            [t1].[dActiveDate] 
          FROM [#Table_1] AS [t1] 
          WHERE [t1].[dcidKala] = [t2].[dcidKala] 
            AND [t2].[dDateFactor] >= [t1].[dActiveDate] 
          ORDER BY [t1].[dActiveDate] DESC 
          UNION ALL 
          SELECT NULL, 
            NULL, 
            NULL) t3 
       ORDER BY CASE 
          WHEN [t2].[dcidKala] IS NOT NULL THEN 0 
          ELSE 1 
         END) AS t1 

DROP TABLE [#Table_1] 
DROP TABLE [#Table_2]