2013-10-28 21 views
-3

我有一個複雜的連接查詢,導致各地12000項目是如下在SQL表中檢索只有一條記錄爲每個實體

SELECT  a.ID AS 'DealID', a.TradeDate, c.COMPANYNAME AS 'Seller Company', a.SellCommission, h.BROKER_FULLNAME AS 'Seller Trader', 
         j.DisplayName AS 'Seller Broker', d.COMPANYNAME AS 'Buyer Company', a.BuyCommission, g.BROKER_FULLNAME AS 'Buyer Trader', 
         i.DisplayName AS 'Buyer Broker', e.PRODUCT_NAME, f.TYPE_DESC AS 'Quantity Type', f.NBR_OF_GALLONS AS 'Quantity Multiplier', a.ContractVolume, 
         a.TotalVolume, a.DeliveryPoint, a.Price, a.ContractStart, a.ContractEnd 
FROM   Confirmations AS a WITH (nolock) LEFT OUTER JOIN 
         COMPANY AS c WITH (nolock) ON c.COMPANY_ID = a.SellCompany LEFT OUTER JOIN 
         COMPANY AS d WITH (nolock) ON d.COMPANY_ID = a.BuyCompany LEFT OUTER JOIN 
         BIOPRODUCTTYPES AS e WITH (nolock) ON e.ID = a.ProductID LEFT OUTER JOIN 
         BIO_QUANTITY_TYPE AS f WITH (nolock) ON f.ID = a.QuantityTypeID LEFT OUTER JOIN 
         COMPANYBROKER AS g WITH (nolock) ON g.COMPANYBROKER_ID = a.BuyTrader LEFT OUTER JOIN 
         COMPANYBROKER AS h WITH (nolock) ON h.COMPANYBROKER_ID = a.SellTrader LEFT OUTER JOIN 
         Users AS i WITH (nolock) ON i.ID = a.BuyBroker LEFT OUTER JOIN 
         Users AS j WITH (nolock) ON j.ID = a.SellBroker 
WHERE  (a.TradeDate >= '2011-04-01 00:00:00') AND (a.TradeDate <= '2013-10-25 00:00:00') 
ORDER BY a.TradeDate 

但不是所有的12000條記錄我只想一個記錄是每個「賣家交易者」的最近記錄(目前上面的查詢返回賣家交易者完成的所有交易),其可能返回大約300條記錄。

+0

是每個記錄是否一致?如果是這樣,這聽起來像是一個狡猾的加入你的查詢。你可以使用'Select Disctint ...'來過濾它們,但那不是真正解決問題 - 只是隱藏它。 –

+0

您是否需要每個「賣家交易者」的最新記錄?您如何確定需要什麼?更具體一點。一些樣本/期望的輸出也會有幫助.. – Milen

+0

@MilenPavlov。我需要每個「賣家交易者」 – DoIt

回答

1

爲了獲得最新的記錄,一個方法是子查詢下的數據:

SELECT a.ID AS 'DealID', 
     a.TradeDate, 
     c.COMPANYNAME AS 'Seller Company', 
     a.SellCommission, 
     h.BROKER_FULLNAME AS 'Seller Trader', 
     j.DisplayName AS 'Seller Broker', 
     d.COMPANYNAME AS 'Buyer Company', 
     a.BuyCommission, 
     g.BROKER_FULLNAME AS 'Buyer Trader', 
     i.DisplayName AS 'Buyer Broker', 
     e.PRODUCT_NAME, 
     f.TYPE_DESC AS 'Quantity Type', 
     f.NBR_OF_GALLONS AS 'Quantity Multiplier', 
     a.ContractVolume, 
     a.TotalVolume, 
     a.DeliveryPoint, 
     a.Price, 
     a.ContractStart, 
     a.ContractEnd 
FROM Confirmations AS a WITH (NOLOCK) 
     LEFT OUTER JOIN COMPANY AS c WITH (NOLOCK) ON c.COMPANY_ID = a.SellCompany 
     LEFT OUTER JOIN COMPANY AS d WITH (NOLOCK) ON d.COMPANY_ID = a.BuyCompany 
     LEFT OUTER JOIN BIOPRODUCTTYPES AS e WITH (NOLOCK) ON e.ID = a.ProductID 
     LEFT OUTER JOIN BIO_QUANTITY_TYPE AS f WITH (NOLOCK) ON f.ID = a.QuantityTypeID 
     LEFT OUTER JOIN COMPANYBROKER AS g WITH (NOLOCK) ON g.COMPANYBROKER_ID = a.BuyTrader 
     LEFT OUTER JOIN COMPANYBROKER AS h WITH (NOLOCK) ON h.COMPANYBROKER_ID = a.SellTrader 
     LEFT OUTER JOIN Users AS i WITH (NOLOCK) ON i.ID = a.BuyBroker 
     LEFT OUTER JOIN Users AS j WITH (NOLOCK) ON j.ID = a.SellBroker 
WHERE a.ID in 
     (
      Select max(ID) 
      from Confirmations (NOLOCK) 
      Where TradeDate >= '2011-04-01 00:00:00' AND TradeDate <= '2013-10-25 00:00:00' 
      Group by SellTrader 
     ) 
ORDER BY a.TradeDate; 
+0

這並沒有解決我拋出問題的問題除非每個組表達式都必須包含至少一個不是外部引用的列,並且我還需要每個「賣方交易者」的最近記錄 – DoIt

+0

對不起,複製粘貼錯誤 - 組中包含一個「a.」,它在哪裏不應該有。它現在應該工作。假設您的ID是連續的,那麼最大ID應代表最近的賣家交易者數據。 –

+0

完美謝謝。 – DoIt

1

,你可以寫:

select * from (
SELECT  a.ID AS 'DealID', 
      a.TradeDate, 
      c.COMPANYNAME AS 'Seller Company', 
      a.SellCommission, 
      h.BROKER_FULLNAME AS 'Seller Trader', 
      j.DisplayName AS 'Seller Broker', 
      d.COMPANYNAME AS 'Buyer Company', 
      a.BuyCommission, 
      g.BROKER_FULLNAME AS 'Buyer Trader', 
      i.DisplayName AS 'Buyer Broker', 
      e.PRODUCT_NAME, 
      f.TYPE_DESC AS 'Quantity Type', 
      f.NBR_OF_GALLONS AS 'Quantity Multiplier', 
      a.ContractVolume, 
      a.TotalVolume, 
      a.DeliveryPoint, 
      a.Price, 
      a.ContractStart, 
      a.ContractEnd 
      ,ROW_NUMBER() over (partition by h.BROKER_FULLNAME order by a.TradeDate desc) as row_num 
FROM   Confirmations AS a WITH (nolock) LEFT OUTER JOIN 
         COMPANY AS c WITH (nolock) ON c.COMPANY_ID = a.SellCompany LEFT OUTER JOIN 
         COMPANY AS d WITH (nolock) ON d.COMPANY_ID = a.BuyCompany LEFT OUTER JOIN 
         BIOPRODUCTTYPES AS e WITH (nolock) ON e.ID = a.ProductID LEFT OUTER JOIN 
         BIO_QUANTITY_TYPE AS f WITH (nolock) ON f.ID = a.QuantityTypeID LEFT OUTER JOIN 
         COMPANYBROKER AS g WITH (nolock) ON g.COMPANYBROKER_ID = a.BuyTrader LEFT OUTER JOIN 
         COMPANYBROKER AS h WITH (nolock) ON h.COMPANYBROKER_ID = a.SellTrader LEFT OUTER JOIN 
         Users2 AS i WITH (nolock) ON i.ID = a.BuyBroker LEFT OUTER JOIN 
         Users2 AS j WITH (nolock) ON j.ID = a.SellBroker 
WHERE  (a.TradeDate >= '2011-04-01 00:00:00') AND (a.TradeDate <= '2013-10-25 00:00:00') 
) T 
where row_num = 1 
ORDER BY T.TradeDate 
+0

@Deepshika這人也工作。 – DoIt

相關問題