![](/img/trans.png)
[英]SELECT query with selecting multiple columns where one column should be distinct mssql
[英]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 by
列group 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.