SQL 服务器中多个表的最新日期和价格
Most recent date and price from multiple tables in SQL Server
我有 5 个 table:
contracts, contracts_data, contracts_anexes, anexes, anexes_data
Table contracts
列:
id_contract | date_sign
------------+-----------
1 | 2013-01-03
2 | 2013-06-05
3 | 2014-10-12
Table contracts_data
列:
id_contract | price
------------+------
1 | 100
2 | 200
3 | 300
Table uontracts_anexes
列:
id_contract | id_anex
------------+--------
1 | 1
1 | 2
2 | 3
Table anexes
列:
id_anex | date_of_sign
--------+--------------
1 | 2014-01-03
2 | 2014-06-05
3 | 2015-01-12
Table anexes_Data
列:
id_anex | price
--------+------
1 | 200
2 | 300
3 | 400
现在我需要 select 价格(来自 contracts_data
或 anexes_data
),其中签名日期最近(最大 date_sign
来自 contracts
和 anexes
),但并非所有 id_contract
都在 table contracts_anexes
中(并非所有合同都有附件),一份合同(id_contract
)可能有多个anexes
(contracts_anexes
table 中的多行)
例如
- 对于
id_contract = 1
我需要 return 价格 300 和日期 2014-06-05,
- 对于
id_contract = 2
我需要 return 价格 400 和日期 2015-01-12
- 对于
id_contract = 3
我需要 return 价格 300 和日期 2014-10-12
您可以将 UNION ALL
与 ROW_NUMBER
一起使用:
;WITH CteUnion AS(
SELECT
id_contract = c.id_contract,
price = cd.price,
date_sign = c.date_sign
FROM contracts c
LEFT JOIN contracts_data cd
ON cd.id_contract = c.id_contract
UNION ALL
SELECT
id_contract = c.id_contract,
price = ad.price,
date_sign = a.date_sign
FROM contracts c
LEFT JOIN contracts_anexes ca
ON ca.id_contract = c.id_contract
LEFT JOIN anexes a
ON a.id_anex = ca.id_anex
LEFT JOIN anexes_data ad
ON ad.id_anex = a.id_anex
)
SELECT
id_contract,
price,
date_sign
FROM(
SELECT *, RN = ROW_NUMBER() OVER(PARTITION BY id_contract ORDER BY date_sign DESC)
FROM CteUnion
)c
WHERE RN = 1
参见SQL Fiddle。
我有 5 个 table:
contracts, contracts_data, contracts_anexes, anexes, anexes_data
Table contracts
列:
id_contract | date_sign
------------+-----------
1 | 2013-01-03
2 | 2013-06-05
3 | 2014-10-12
Table contracts_data
列:
id_contract | price
------------+------
1 | 100
2 | 200
3 | 300
Table uontracts_anexes
列:
id_contract | id_anex
------------+--------
1 | 1
1 | 2
2 | 3
Table anexes
列:
id_anex | date_of_sign
--------+--------------
1 | 2014-01-03
2 | 2014-06-05
3 | 2015-01-12
Table anexes_Data
列:
id_anex | price
--------+------
1 | 200
2 | 300
3 | 400
现在我需要 select 价格(来自 contracts_data
或 anexes_data
),其中签名日期最近(最大 date_sign
来自 contracts
和 anexes
),但并非所有 id_contract
都在 table contracts_anexes
中(并非所有合同都有附件),一份合同(id_contract
)可能有多个anexes
(contracts_anexes
table 中的多行)
例如
- 对于
id_contract = 1
我需要 return 价格 300 和日期 2014-06-05, - 对于
id_contract = 2
我需要 return 价格 400 和日期 2015-01-12 - 对于
id_contract = 3
我需要 return 价格 300 和日期 2014-10-12
您可以将 UNION ALL
与 ROW_NUMBER
一起使用:
;WITH CteUnion AS(
SELECT
id_contract = c.id_contract,
price = cd.price,
date_sign = c.date_sign
FROM contracts c
LEFT JOIN contracts_data cd
ON cd.id_contract = c.id_contract
UNION ALL
SELECT
id_contract = c.id_contract,
price = ad.price,
date_sign = a.date_sign
FROM contracts c
LEFT JOIN contracts_anexes ca
ON ca.id_contract = c.id_contract
LEFT JOIN anexes a
ON a.id_anex = ca.id_anex
LEFT JOIN anexes_data ad
ON ad.id_anex = a.id_anex
)
SELECT
id_contract,
price,
date_sign
FROM(
SELECT *, RN = ROW_NUMBER() OVER(PARTITION BY id_contract ORDER BY date_sign DESC)
FROM CteUnion
)c
WHERE RN = 1
参见SQL Fiddle。