2017-08-26 42 views
1

我有一個表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日? 如果有幾個相等的最大值,我想有最小(最早)的日期。

+0

,如果你有兩個等於最大值?應該顯示兩個? –

+0

我想擁有最小的日期(最早的) – JulGreen

+0

因此,請在您的問題上添加該信息,因爲它可以改變我們的回答。 –

回答

1
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) 
1

如果您需要具體哪一行,最大數量*價格,最老的一天

SELECT TOP(1) * 
FROM MyTable 
ORDER BY Qty * Price DESC, [Date]; 

如果需要都具有相同的最大數量*價值的行

SELECT TOP(1) WITH TIES * 
FROM MyTable 
ORDER BY Qty * Price DESC; 
1

只是爲了好玩它...

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函數將連接後的二進制值拆分回其組成部分(這很容易,因爲我們知道每個部分的確切時間很長),並將其轉換回原始數據類型,現在只需完成這些操作。

+0

那也行,恐怕我不明白爲什麼。 MaxBin對我仍然不確定。這將比以前的解決方案在大量數據上更快嗎? – JulGreen

+0

我之前的回答已經更新了一個簡短的解釋。只要它比其他方法更快......它應該與其他單一表格解決方案相對應,但索引將產生巨大影響。唯一能夠確定的方法就是在自己的環境中對其進行測試。 –