簡體   English   中英

選擇一個不同的列,IE Finetuning選擇查詢

[英]Selecting one distinct column, I.E Finetuning select query

我使用波紋管查詢在ID上合並1(或者可能是幾個表,並且是從我編寫的php腳本生成的),這些ID並不相同,但是第一個表中的Id部分是第二個Id的一部分,因此我為什么要做一個子串就可以了。 在最完美的世界中,如果存在相同的表,那么我只會在兩個表中保留id的聯接,但事實並非如此。

select t0.Id,t0.CustomerName,t0.Region,t0.Country,t0.StopTime,t0.CustomerId,t1.Id, t1.Time
from (select distinct Id,CustomerName,Region,Country, StopTime,CustomerId from [dbcust].[dbo].[_Content]) t0 
Inner JOIN 
(select distinct Id, Time from [dbcust].[dbo].[_Cpu]) t1 
        on SUBSTRING(t1.Id,CHARINDEX('_',t1.Id,10)+1,(CHARINDEX('_',t1.Id,15) - CHARINDEX('_',t1.Id,10)-1))=SUBSTRING(t0.Id,CHARINDEX('_',t0.Id,10)+1,(CHARINDEX('_',t0.Id,15) - CHARINDEX('_',t0.Id,10)-1)) ORDER BY t1.Time DESC

在這里,我得到了很多除了StopTime之外都相同的字段,請參見下面的示例:

       StopTime                   Time
2015-04-01 23:59:00.000    2015-04-18 23:00:01
2015-04-02 23:59:00.000    2015-04-18 23:00:01
2015-04-03 23:59:00.000    2015-04-18 23:00:01
2015-04-04 23:59:00.000    2015-04-18 23:00:01
2015-04-05 23:59:00.000    2015-04-18 23:00:01
2015-04-06 23:59:00.000    2015-04-18 23:00:01
2015-04-07 23:59:00.000    2015-04-18 23:00:01
2015-04-08 23:59:00.000    2015-04-18 23:00:01
2015-04-09 23:59:00.000    2015-04-18 23:00:01
2015-04-10 23:59:00.000    2015-04-18 23:00:01
2015-04-11 23:59:00.000    2015-04-18 23:00:01
2015-04-12 23:59:00.000    2015-04-18 23:00:01
2015-04-13 23:59:00.000    2015-04-18 23:00:01
2015-04-14 23:59:00.000    2015-04-18 23:00:01
2015-04-15 23:59:00.000    2015-04-18 23:00:01
2015-04-16 23:59:00.000    2015-04-18 23:00:01
2015-04-17 23:59:00.000    2015-04-18 23:00:01
2015-04-18 23:59:00.000    2015-04-18 23:00:01

但是在這里我只想要唯一的時間,是否可以將唯一的時間和最新的StopTime排在一起?

像風箱一樣?

        StopTime                   Time
2015-04-01 23:59:00.000    2015-04-18 23:00:01

我嘗試在第二個select語句中使用group by語句,例如:

(select distinct Id,CustomerName,Region,Country, StopTime,CustomerId from [dbcust].[dbo].[_Content] group by StopTime)

但是我收到語法錯誤

列'dbcust.dbo._Content.Id'在選擇列表中無效,因為它既不包含在聚合函數中,也不包含在GROUP BY子句中。

也許你們可以幫助我優化選擇查詢以加快數據收集速度? =)

提前致謝。

你可以這樣做:

WITH YourQuery
AS
(
    select t0.Id,t0.CustomerName,t0.Region,t0.Country,t0.StopTime,t0.CustomerId,t1.Id, t1.Time
    from (select distinct Id,CustomerName,Region,Country, StopTime,CustomerId from [dbcust].[dbo].[_Content]) t0 
    Inner JOIN 
    (select distinct Id, Time from [dbcust].[dbo].[_Cpu]) t1 
            on SUBSTRING(t1.Id,CHARINDEX('_',t1.Id,10)+1,(CHARINDEX('_',t1.Id,15) - CHARINDEX('_',t1.Id,10)-1))=SUBSTRING(t0.Id,CHARINDEX('_',t0.Id,10)+1,(CHARINDEX('_',t0.Id,15) - CHARINDEX('_',t0.Id,10)-1)) 
), Ranked
AS
(
   select Id,
     CustomerName,
     Region,
     Country,
     StopTime,
     CustomerId,
     Id, 
     Time,
     ROW_NUMBER() OVER(PARTITION BY Time ORDER BY StopTime DESC) AS R1
    from  YourQuery
)
SELECT Id,
     CustomerName,
     Region,
     Country,
     StopTime,
     CustomerId,
     Id, 
     Time
FROM Ranked
WHERE RN = 1;

ROW_NUMBER函數將給予每個一個等級數time ,所以選擇where rn = 1會給你最新的stoptime


對於您嘗試的查詢:

select distinct Id,CustomerName,Region,Country, 
   StopTime,CustomerId 
from [dbcust].[dbo].[_Content] 
group by StopTime

在sql server中, group bygroup by時,除非在group by子句或聚合函數中,否則您不能選擇任何列,因此為了正確地編寫它,應如下所示:

select stopTime, MIN(CustomerId) -- just an example
from [dbcust].[dbo].[_Content] 
group by StopTime

或使用完整查詢,您可以執行以下操作:

SELECT stoptime, MAX(Time) AS LatestTime
FROM
(
    select t0.Id,t0.CustomerName,t0.Region,t0.Country,t0.StopTime,t0.CustomerId,t1.Id, t1.Time
            from (select distinct Id,CustomerName,Region,Country, StopTime,CustomerId from [dbcust].[dbo].[_Content]) t0 
            Inner JOIN 
            (select distinct Id, Time from [dbcust].[dbo].[_Cpu]) t1 
                    on SUBSTRING(t1.Id,CHARINDEX('_',t1.Id,10)+1,(CHARINDEX('_',t1.Id,15) - CHARINDEX('_',t1.Id,10)-1))=SUBSTRING(t0.Id,CHARINDEX('_',t0.Id,10)+1,(CHARINDEX('_',t0.Id,15) - CHARINDEX('_',t0.Id,10)-1)) 
) AS t
GROUP BY stoptime

這將為您提供所需的確切結果,但只有stoptime時間和最新時間​​。

因此,要選擇其他列作為兩列,我使用了排名功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM