如何从基本记录查询中指定以下值?
How to specified below value from base record query?
我有 table 这样的,我需要在 table 中指定低于基价的价格。
id value price base
1 aaa 100
2 bbb 200
3 ccc 300 Yes
4 aaa 200 Yes
5 aaa 300
6 aaa 400
像这样:
id value price status
1 aaa 100 down
2 bbb 200
3 ccc 300 base
4 aaa 200 base
5 aaa 300 up
6 aaa 400 up
使用此代码我可以获得最高和最低价格值:
SELECT
min(price) as min_price
, max(price) as max_price
FROM
(
select *
From MyTable
) tmp;
如果我对问题的理解正确,以下陈述可能是解决您问题的方法:
Table:
SELECT *
INTO MyTable
FROM (VALUES
(1, 'aaa', 100, NULL, CONVERT(varchar(5), NULL)),
(2, 'bbb', 200, NULL, CONVERT(varchar(5), NULL)),
(3, 'ccc', 300, 'Yes', CONVERT(varchar(5), NULL)),
(4, 'aaa', 200, 'Yes', CONVERT(varchar(5), NULL)),
(5, 'aaa', 300, NULL, CONVERT(varchar(5), NULL)),
(6, 'aaa', 400, NULL, CONVERT(varchar(5), NULL))
) v (id, value, price, base, status)
SELECT 语句:
SELECT
id,
value,
price,
base,
CASE
WHEN base = 'Yes' THEN 'base'
WHEN price < MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'down'
WHEN price > MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'up'
END AS status
FROM MyTable
ORDER By id
更新声明:
; WITH cte AS (
SELECT
id,
value,
price,
base,
status,
CASE
WHEN base = 'Yes' THEN 'base'
WHEN price < MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'down'
WHEN price > MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'up'
END AS status2
FROM MyTable
)
UPDATE cte
SET status = status2
结果:
id value price base status
--------------------------
1 aaa 100 down
2 bbb 200
3 ccc 300 Yes base
4 aaa 200 Yes base
5 aaa 300 up
6 aaa 400 up
我有 table 这样的,我需要在 table 中指定低于基价的价格。
id value price base
1 aaa 100
2 bbb 200
3 ccc 300 Yes
4 aaa 200 Yes
5 aaa 300
6 aaa 400
像这样:
id value price status
1 aaa 100 down
2 bbb 200
3 ccc 300 base
4 aaa 200 base
5 aaa 300 up
6 aaa 400 up
使用此代码我可以获得最高和最低价格值:
SELECT
min(price) as min_price
, max(price) as max_price
FROM
(
select *
From MyTable
) tmp;
如果我对问题的理解正确,以下陈述可能是解决您问题的方法:
Table:
SELECT *
INTO MyTable
FROM (VALUES
(1, 'aaa', 100, NULL, CONVERT(varchar(5), NULL)),
(2, 'bbb', 200, NULL, CONVERT(varchar(5), NULL)),
(3, 'ccc', 300, 'Yes', CONVERT(varchar(5), NULL)),
(4, 'aaa', 200, 'Yes', CONVERT(varchar(5), NULL)),
(5, 'aaa', 300, NULL, CONVERT(varchar(5), NULL)),
(6, 'aaa', 400, NULL, CONVERT(varchar(5), NULL))
) v (id, value, price, base, status)
SELECT 语句:
SELECT
id,
value,
price,
base,
CASE
WHEN base = 'Yes' THEN 'base'
WHEN price < MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'down'
WHEN price > MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'up'
END AS status
FROM MyTable
ORDER By id
更新声明:
; WITH cte AS (
SELECT
id,
value,
price,
base,
status,
CASE
WHEN base = 'Yes' THEN 'base'
WHEN price < MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'down'
WHEN price > MAX(CASE WHEN base = 'Yes' THEN price END) OVER (PARTITION BY value) THEN 'up'
END AS status2
FROM MyTable
)
UPDATE cte
SET status = status2
结果:
id value price base status
--------------------------
1 aaa 100 down
2 bbb 200
3 ccc 300 Yes base
4 aaa 200 Yes base
5 aaa 300 up
6 aaa 400 up