kra*_*626 2 sql t-sql sql-server sql-server-2005
有人请更改我的标题,以更好地反映我想问的问题.
我有一张桌子
Table (id, value, value_type, data)
Run Code Online (Sandbox Code Playgroud)
ID不是唯一的.没有唯一的钥匙.
value_type 有两个可能的值,比方说A和B.
B型优于A,但通常不可用.
对于每个id,如果存在value_type B的任何记录,我希望所有具有该id和value_type B的记录.
如果没有带有value_Type B的id的记录,我想要所有具有该id和value_type A的记录.
请注意,如果B存在该ID,我不希望记录类型为A.
我目前使用一系列临时表来完成此操作.是否有一个可以完成工作的select语句(子查询OK)?
非常感谢!
额外细节:
SQL Server 2005
RANK,而不是ROW_NUMBER,因为你想要关系(具有相同B值的关系)具有相同的排名值:
WITH summary AS (
SELECT t.*,
RANK() OVER (PARTITION BY t.id
ORDER BY t.value_type DESC) AS rank
FROM TABLE t
WHERE t.value_type IN ('A', 'B'))
SELECT s.id,
s.value,
s.value_type,
s.data
FROM summary s
WHERE s.rank = 1
Run Code Online (Sandbox Code Playgroud)
非CTE版本:
SELECT s.id,
s.value,
s.value_type,
s.data
FROM (SELECT t.*,
RANK() OVER (PARTITION BY t.id
ORDER BY t.value_type DESC) AS rank
FROM TABLE t
WHERE t.value_type IN ('A', 'B')) s
WHERE s.rank = 1
Run Code Online (Sandbox Code Playgroud)
WITH test AS (
SELECT 1 AS id, 'B' AS value_type
UNION ALL
SELECT 1, 'B'
UNION ALL
SELECT 1, 'A'
UNION ALL
SELECT 2, 'A'
UNION ALL
SELECT 2, 'A'),
summary AS (
SELECT t.*,
RANK() OVER (PARTITION BY t.id
ORDER BY t.value_type DESC) AS rank
FROM test t)
SELECT *
FROM summary
WHERE rank = 1
Run Code Online (Sandbox Code Playgroud)
我明白了:
id value_type rank
----------------------
1 B 1
1 B 1
2 A 1
2 A 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12151 次 |
| 最近记录: |