Sme*_*ead 3 sql sql-server case
CREATE TABLE test
(
sts_id int
, [status1] int
, [status2] int
, [status3] int
, [status4] int
)
INSERT INTO test values
('1','999','0','0','0'),
('1','100','0','0','0'),
('2','200','999','0','0'),
('3','500','600','999','0'),
('4','200','700','900','998'),
('4','300','400','800','999')
Run Code Online (Sandbox Code Playgroud)
在SQL Server(2016)中,我查询上表以获得最高值<= 900(如果可能)
SELECT DISTINCT
sts_id
, CASE
WHEN status1 > 0 AND status2 = 0 THEN status1
WHEN status2 > 900 AND status3 = 0 THEN status1
WHEN status2 BETWEEN 1 AND 900 AND status3 = 0 THEN status2
WHEN status3 > 900 AND status4 = 0 THEN status2
WHEN status3 BETWEEN 1 AND 900 AND status4 = 0 THEN status3
WHEN status4 > 900 THEN status3 WHEN status4 BETWEEN 1 AND 900 THEN status4
ELSE status1
END AS 'status'
FROM test
Run Code Online (Sandbox Code Playgroud)
给我这个:
| sts_ID | status |
|--------|--------|
| 1 | 100 |
| 1 | 999 |
| 2 | 200 |
| 3 | 600 |
| 4 | 800 |
| 4 | 900 |
Run Code Online (Sandbox Code Playgroud)
然后我将它加入到sts_id上的另一个表中,并获取max(status)值.
但是,我不关心900以上的状态,例如sts_id 1会给我999,即使我更喜欢给我100.
有没有什么方法可以合并某种CASE来获得下一个值,如果有一个ID可用?dense_rank()可能有帮助吗?
如果您将表格拆分为单个status列,这似乎会更容易.这是一个方法CROSS APPLY:
SELECT sts_id, MAX(status) MaxStatus
FROM TEST
CROSS APPLY (VALUES (status1),
(status2),
(status3),
(status4)
) A (status)
WHERE STATUS <= 900
GROUP BY sts_id
Run Code Online (Sandbox Code Playgroud)
结果:
STS_ID MaxStatus
1 100
2 200
3 600
4 900
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |