[英]How to compare the first two rows in SQL Server
我有以下表格作為示例:
MTRL表
|MTRL| CODE |
---------------
| 1 | 080109 |
| 2 | 085145 |
| 3 | 084141 |
地鐵表
|MTRL| PRICE | FINDOC |
-------------------------
| 1 | 4.95 | 12345 |
| 1 | 4.50 | 23421 |
| 1 | 3.90 | 23499 |
|MTRL| PRICE | FINDOC |
-------------------------
| 2 | 2.95 | 45345 |
我當前正在使用這兩個查詢,然后將輸出存儲到變量中。 我正在與編程進行比較。 但是與其運行兩個查詢,不如運行一個查詢然后獲取輸出,這會更好。
所以我想比較最后兩個價格。 如果最后一個價格已發生重大變化,或者只有一個價格(如mtrl2),則輸出價格1
SELECT
, SUB.PRICE
FROM (
SELECT
, ML.PRICE
, rn = row_number() over (PARTITION BY M.CODE ORDER BY FINDOC DESC)
FROM MTRLINES ML
INNER JOIN MTRL M
ON M.MTRL = ML.MTRL AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2))
WHERE M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
) sub
WHERE rn IN (1)
這存儲在變量price1
SELECT
, SUB.PRICE
FROM (
SELECT
, ML.PRICE
, rn = row_number() over (PARTITION BY M.CODE ORDER BY FINDOC DESC)
FROM MTRLINES ML
INNER JOIN MTRL M
ON M.MTRL = ML.MTRL AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2))
WHERE M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
) sub
WHERE rn IN (2)
這存儲在可變的price2
我正在像編程一樣做(這是vbscript):
If ABS(price1-price2)>0.02 Then
Result=Price1
Else
Result=0
End If
如何僅使用SQL來實現?
我可能會建議:
with prices as (
select code,
max(case when seqnum = 1 then price end) as price_last,
max(case when seqnum = 2 then price end) as price_second,
count(*) as num_prices
from (select ml.price, m.code,
row_number() over (partition by M.CODE order by FINDOC desc) as seqnum
from MTRLINES ML inner join
MTRL M
ON M.MTRL = ML.MTRL and
FINDOC in (select FINDOC from FINDOC where SOSOURCE = 1251 and FPRMS in (1, 2)
)
where M.SODTYPE = 51 and M.COMPANY = 1 and
M.CODE = :kod_an
) m
where seqnum in (1, 2)
group by code
)
select (case when num_prices = 1 then price_last
when abs(price_last - price_second) > 0.02 then price_last
else 0
end)
from prices;
請注意,您的代碼一次只能執行一個代碼。 您可以刪除M.CODE = :kod_an
並在多個代碼上運行該代碼。
嘗試這樣的事情。 在沒有樣本數據的情況下沒有對其進行測試,但是其想法是首先在CTE中獲得兩行(rn = 1和rn = 2)。 然后,使用case
語句查找abs
值,並為rn=
返回0
或PRICE
。
我也假設您的其余查詢是正確的
;with t as (
SELECT
SUB.PRICE
FROM (
SELECT
ML.PRICE
, rn = row_number() over (PARTITION BY M.CODE ORDER BY FINDOC DESC)
FROM MTRLINES ML
INNER JOIN MTRL M
ON M.MTRL = ML.MTRL AND FINDOC IN (SELECT FINDOC FROM FINDOC WHERE SOSOURCE=1251 AND FPRMS IN (1,2))
WHERE M.SODTYPE=51 AND M.COMPANY=1 AND M.CODE=:kod_an
) sub
WHERE rn IN (1,2)
)
select case
when abs(sum(case when rn=1
then price
else (price * -1 )
end)
)
> 0.02
then (select price1 from t where rn=1)
else 0 end
as result
from t
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.