简体   繁体   中英

SQL Server - Update table1 with max condition in table1

I'm fairly new to SQL. This site has been a great resource and I found answers to many questions so far. Now I'm a little stuck, so it's time for my first question.

I'm working in SQL Server 2012. How do I update FLAG = 'Y' when START_DATE = (SELECT CONTRACT, MIN(START_DATE) FROM #CONTR GROUP BY CONTRACT) ?

CREATE TABLE #CONTR
(
CONTRACT        INT ,       -- PRIMARY KEY COL1
CONTRACT_LINE   INT ,       -- PRIMARY KEY COL2
START_DATE      INT ,       -- 0 = CURRENT MONTH, -3 = THREE MONTHS IN PAST
FLAG            VARCHAR(1)  -- 'Y' OR 'N', DEFAULTED TO 'N' WHEN TABLE POPULATED
)

This doesn't seem like it should be that difficult, but I just can't seem to get it to work.

INSERT INTO #CONTR VALUES (1,1,100,'N')
INSERT INTO #CONTR VALUES (1,1,200,'N')

INSERT INTO #CONTR VALUES (2,1,100,'N')
INSERT INTO #CONTR VALUES (2,1,200,'N')

UPDATE
    c
SET
    c.FLAG = 'Y'
FROM
    #CONTR c
    JOIN (
           SELECT
            CONTRACT _CONTRACT ,
            MAX(START_DATE) _START_DATE
           FROM
            #CONTR
           GROUP BY
            CONTRACT
         ) mc ON c.CONTRACT = mc.[_CONTRACT] AND c.START_DATE = mc.[_START_DATE]

Another way to do that. It is absolutely the same, just the syntax is different:

UPDATE
    c
SET
    c.FLAG = 'Y'
FROM
    #CONTR c
    CROSS APPLY (
           SELECT
            c1.CONTRACT _CONTRACT 
           FROM
            #CONTR c1
            WHERE c1.CONTRACT = c.CONTRACT
           GROUP BY
            CONTRACT
            HAVING MAX(c1.START_DATE) = c.START_DATE  
         ) mc;

And the results:

SELECT * FROM #CONTR
CONTRACT    CONTRACT_LINE   START_DATE  FLAG
1   1   100 N
1   1   200 Y
2   1   100 N
2   1   200 Y
UPDATE #CONTR
SET    FLAG = 'Y'
FROM #CONTR C1
     JOIN 
     (SELECT CONTRACT, MIN(START_DATE) AS START_DATE FROM #CONTR GROUP BY CONTRACT) C2
     ON C1.START_DATE = C2.START_DATE

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM