SQL語句 對錶按某幾個字段分組,並生成組內記錄數範圍內的隨機序號.

CREATE TABLE gw_card
(
id 
INT IDENTITY(1,1),
address 
VARCHAR(100),
subjecth 
INT,
subject 
VARCHAR(10),
id_key 
VARCHAR(10)
)
INSERT gw_card SELECT 'aa',1,'xx',NULL
UNION ALL SELECT 'aa',1,'xx',NULL
UNION ALL SELECT 'bb',1,'xx',NULL
UNION ALL SELECT 'cc',1,'yy',NULL
UNION ALL SELECT 'bb',1,'xx',NULL
UNION ALL SELECT 'aa',1,'xx',NULL
UNION ALL SELECT 'aa',1,'xx',NULL
GO
--查看原始數據
SELECT * FROM gw_card
/*
1    aa    1    xx    NULL
2    aa    1    xx    NULL
3    bb    1    xx    NULL
4    cc    1    yy    NULL
5    bb    1    xx    NULL
6    aa    1    xx    NULL
7    aa    1    xx    NULL
*/

GO

--得到要生成的取機數的總數
DECLARE @n INT
SELECT @n=COUNT(*FROM gw_card

SET ROWCOUNT @n

--創建生成隨機數據的臨時表
CREATE TABLE #(id INT IDENTITY,gid INT,x INT)

--按科目和地址分組,得到每組的記錄數,及待分配的隨機數值
INSERT #
    
SELECT DISTINCT gid,CAST(RAND(CHECKSUM(NEWID())) * cnt + 1 AS INT)
        
FROM sysobjects a
    
CROSS JOIN 
        (
SELECT CHECKSUM(address,subjecth,subject) gid,COUNT(*) cnt 
            
FROM gw_card
            
GROUP BY address,subjecth,subject
        ) b

SET ROWCOUNT 0

GO

--進行更新操作
UPDATE e SET e.id_key = RIGHT('0000000000' + RTRIM(x.x),10)
    
--SELECT e.*,RIGHT('0000000000' + RTRIM(x.x),10),CHECKSUM(address,subjecth,subject),gid,x.id,x
    FROM gw_card e
INNER JOIN # x
    
ON CHECKSUM(address,subjecth,subject)=gid
        
AND (SELECT COUNT(*FROM #
            
WHERE gid = x.gid
                
AND id <= x.id
            )
=
            (
            
SELECT COUNT(*FROM gw_card 
                
WHERE /*address = e.address
                    AND subjecth = e.subjecth
                    AND subject = e.subject
*/

                     CHECKSUM(address,subjecth,subject)
=CHECKSUM(e.address,e.subjecth,e.subject)
                    
AND id<=e.id)
/*這個地方,樓主還連的有其它表, 因爲它們不影響分配id_key的值,所以我也就沒有建相應的測試表及測試數據,樓主可以自行加上*/

GO

--按地址及科目分組順序 查看更改後的id_key值.可以看到同一組的id_card已獲得更新,並且值在每組個數的範圍內隨機分配,且不重複
SELECT * FROM gw_card
    
ORDER BY address,subjecth,subject,id
/*
1    aa    1    xx    0000000004
2    aa    1    xx    0000000001
6    aa    1    xx    0000000003
7    aa    1    xx    0000000002
3    bb    1    xx    0000000002
5    bb    1    xx    0000000001
4    cc    1    yy    0000000001
*/


GO

DROP TABLE #,gw_card
GO
 
發佈了32 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章