我有一個表MyTable
這樣的通訊員日期:怎麼回事最大值
Date Qty Price 2017-07-01 2 5.00 2017-07-08 3 4.00 2017-08-08 1 6.00
如果我做一個查詢來獲取這樣的最大總成本:
SELECT max(Qty * Price) FROM MyTable
我得到12.00
這是正確的。
怎樣纔可以有相應的日期是2017年7月8日? 如果有幾個相等的最大值,我想有最小(最早)的日期。
我有一個表MyTable
這樣的通訊員日期:怎麼回事最大值
Date Qty Price 2017-07-01 2 5.00 2017-07-08 3 4.00 2017-08-08 1 6.00
如果我做一個查詢來獲取這樣的最大總成本:
SELECT max(Qty * Price) FROM MyTable
我得到12.00
這是正確的。
怎樣纔可以有相應的日期是2017年7月8日? 如果有幾個相等的最大值,我想有最小(最早)的日期。
create table MyTable (date datetime, qty int, price int)
go
insert into MyTable(date,qty,price)
values
('2017-07-01', 2, 5.00),
('2017-07-08', 3, 4.00),
('2017-08-08', 1, 6.00);
with q as
(
select *, row_number() over (order by qty*price desc) rn
from MyTable
)
select date, qty, price
from q
where rn = 1;
輸出
date qty price
----------------------- ----------- -----------
2017-07-08 00:00:00.000 3 4
(1 row(s) affected)
如果您需要具體哪一行,最大數量*價格,最老的一天
SELECT TOP(1) *
FROM MyTable
ORDER BY Qty * Price DESC, [Date];
如果需要都具有相同的最大數量*價值的行
SELECT TOP(1) WITH TIES *
FROM MyTable
ORDER BY Qty * Price DESC;
只是爲了好玩它...
SELECT
[Date] = CAST(SUBSTRING(mv.MaxBin, 9, 8) AS DATE),
Qty = CAST(SUBSTRING(mv.MaxBin, 17, 4) AS INT),
Price = CAST(SUBSTRING(mv.MaxBin, 21, 8) AS MONEY)
FROM (
SELECT
MaxBin = MAX(CAST(td.Qty * td.Price AS BINARY(8)) + CAST(td.Date AS BINARY(8)) + CAST(td.Qty AS BINARY(4)) + CAST(td.Price AS BINARY(8)))
FROM
#TestData td
) mv;
編輯:如何以及爲什麼這個工程...
正如你在開封后,票據「SELECT MAX(數量*價格)FROM MyTable的」讓你正確的值,但這並不能幫助您獲取該行的剩餘列。
所以我們的想法是做計算,然後將其他列值與計算結果連接起來,這樣我們就可以使用之前的邏輯[MAX(Qty * Price))獲得所有需要的列。
鑄造的東西固定長度的二進制值,使我們能夠做到這一點。我們知道Qty * Price = ToalPrice或者根據數據類型INT * MONEY = MONEY,它是一個8字節的數據類型...所以我知道我可以將任何$ amount作爲BINARY(8)投入並知道1)I總是能夠將它轉換回貨幣,2)二進制值長度只有8個字符,3)我可以按照原始值對二進制進行排序。
同樣的日期是一個3字節長的日期數據類型(是的,我用8而不是3 ...我習慣了DATETIME類型...我的那個壞)...等等,與其他欄目。
因此,通過連接二進制值加在一起,我可以表這些值的MAX,就像你用最大做(數量*價格),但現在我有整個數據行。如果使用SUBSTRING函數將連接後的二進制值拆分回其組成部分(這很容易,因爲我們知道每個部分的確切時間很長),並將其轉換回原始數據類型,現在只需完成這些操作。
那也行,恐怕我不明白爲什麼。 MaxBin對我仍然不確定。這將比以前的解決方案在大量數據上更快嗎? – JulGreen
我之前的回答已經更新了一個簡短的解釋。只要它比其他方法更快......它應該與其他單一表格解決方案相對應,但索引將產生巨大影響。唯一能夠確定的方法就是在自己的環境中對其進行測試。 –
,如果你有兩個等於最大值?應該顯示兩個? –
我想擁有最小的日期(最早的) – JulGreen
因此,請在您的問題上添加該信息,因爲它可以改變我們的回答。 –