有張表,列名如下:
日期 產品名稱 產品價格
20180101 aaaa 18.00
20180101 bbbb 5.00
20180101 ccccc 21.36
.......
20180102 aaaa 10.17
20180102 bbbb 17.30
20180102 ccccc 9.40
..........
需求: 列出連續30日,產品價格均值大于30元的產品名單。
uj5u.com熱心網友回復:
去產品價格大于30的,名稱和日期排重row_number patition by 產品名稱 order by 日期
然后得到的序號等于30的,計算當前日期與第一天的天數差,差為29的
uj5u.com熱心網友回復:
試試下面的,沒測驗過
WITH CTE_1
AS
(SELECT *,DATEDIFF(DAY,'19700101',日期) AS SEQ_1
ROW_NUMBER() OVER (PARTITION BY 產品名稱 ORDER BY 日期) AS SEQ_2
FROM TABLE)
SELECT 產品名稱,SEQ_1-SEQ_2
GROUP BY 產品名稱,SEQ_1-SEQ_2
HAVING COUNT(1)=30 AND AVG(產品價格)>30
uj5u.com熱心網友回復:
with t as (
-- 獲取價格大于30的產品,并按照日期和名稱排重
select distinct 日期,產品名稱 from TB where 產品價格>30
),t1 as (
-- 按照名稱分組,按照日期排序生成序號
select *,row_number() over(partition by 產品名稱 order by 日期) as sn from t
)
-- 選擇具有序號比當前序號大29的,且日期也是多29天的產品
-- 序號大29表示有30個以上的產品記錄
-- 日期差和序號差相等,表示是連續日期
select distinct 產品名稱
from t1 a
where exists(
select top 1 1
from t1
where 產品名稱=a.產品名稱
and sn=a.sn+29
and datediff(d,a.日期,日期)=29
)
uj5u.com熱心網友回復:
1.連續30日,這個條件不是很清楚,沒法給你說2.拋開連續30日,這個條件,給你個命令,參考
select 產品名稱, min(產品價格)
from 表
where 日期>20180101 and 日期<20180131
group by 產品名稱
having min(產品價格)>30
uj5u.com熱心網友回復:
there are ways to achieve your requirement,1. row_number
2. using a temp table
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/146787.html
標籤:疑難問題
上一篇:工控機接入環網后,資料庫運行時sqlservr.exe與LSASS.EXE行程占用運存過大導致電腦死機
下一篇:為什么MySQL安裝這么難
