簡體   English   中英

SQL:根據記錄創建日期和其他條件過濾記錄

[英]SQL: Filter records based on record creation date and other criteria

我正在努力尋找一種更好的解決方案,以從用戶呼叫數據表中選擇唯一記錄。 我的表結構如下:

SELECT [MarketName],
       [WebsiteName] ,
       [ID] ,
       [UserID],
       [CreationDate],
       [CallDuration],
       [FromPhone] ,
       [ToPhone],
       [IsAnswered],
       [Source]
FROM [dbo].[UserCallData]

該表中有多個條目,它們具有不同且相同的ID。 我想檢查[FromPhone]和[ToPhone]在過去3個月中是否存在多次,如果是,我想根據[CreationDate]來選擇所有列的第一條記錄,將出現的次數計為TotalCallCount並求和totalCallDuration作為單個記錄。 如果[FromPhone]和[ToPhone]沒有多次出現,我想這樣選擇所有列。 我已經能夠提出如下部分查詢。 但這不會返回所有列而不包括group by子句,也不滿足我的整個條件。 任何幫助,將不勝感激。

select  [FromPhone], 
        MIN([CreationDate]),
        [ToPhone], 
        marketname, 
        count(*) as TotalCallCount , 
        sum(CallDuration) as TotalCallDuration 
from [dbo].[UserCallData]
where  [CreationDate] >= DATEADD(MONTH, -3, GETDATE())
group by  [FromPhone],[ToPhone], marketname 
having count([FromPhone]) > 1 and count([ToPhone]) >1

嘗試使用ROW_NUMBER()

;with cte as
(
    select *, ROW_NUMBER() OVER(PARTITION BY FromPhone, ToPhone ORDER BY CreationDate) as RN
    from UserCallData
    where CreationDate >= DATEADD(MONTH, -3, GETDATE())
),
cte_totals as
(
    select C1.FromPhone, C1.ToPhone, COUNT(*) as TotalCallCount, SUM(CallDuration) as TotalCallDuration
    from cte C1
    where exists(select * from cte C2 where C1.FromPhone = C2.FromPhone and C1.ToPhone = C2.ToPhone and C2.RN > 1)
    group by C1.FromPhone, C1.ToPhone
)
select C1.*, TotalCallCount, TotalCallDuration
from cte C1
    inner join cte_totals C2 on C1.FromPhone = C2.FromPhone and C1.ToPhone = C2.ToPhone
where C1.RN = 1 

我在此處直接編寫了查詢,因此它可能會有一些錯誤或類型錯誤,但主要思想可能很清楚。

我不完全確定我已經理解了這個問題,但是如果我有以下內容,可能就是您想要的(或者是一個有用的起點):

SELECT
       ucd.FromPhone,
       min(ucd.CreationDate) as MinCreationDate,
       ucd.ToPhone,
       ucd.MarketName,
       count(*) as TotalCallCount,
       sum(ucd.CallDuration) as TotalCallDuration,
       case
           when min(ucd.WebsiteName) = max(ucd.WebsiteName) then min(ucd.WebsiteName)
           else '* Various'
       end as WebsiteName,
       case
           when min(ucd.ID) = max(ucd.ID) then min(ucd.ID)
           else '* Various'
       end as ID,
       case
           when min(ucd.UserID) = max(ucd.UserID) then min(ucd.UserID)
           else '* Various'
       end as UserID,
       case
           when min(ucd.IsAnswered) = max(ucd.IsAnswered) then min(ucd.IsAnswered)
           else '* Some'
       end as IsAnswered,
       case
           when min(ucd.Source) = max(ucd.Source) then min(ucd.Source)
           else '* Various'
       end as Source
FROM
    dbo.UserCallData ucd
WHERE
    ucd.CreationDate >= DATEADD(MONTH, -3, GETDATE())
GROUP BY
    ucd.FromPhone,
    ucd.ToPhone,
    ucd.MarketName

在將行折疊在一起的情況下,如果所有行都在給定列上一致(所以min(Field) = max(Field) ),我將返回min(Field)值(所有其他值都相同,但避免出現問題)需要其他會干擾其他情況的“分組依據”子句)。 在他們不同意的地方,我返回了"* something"

該代碼假定所有列都是文本類型的列(您尚未說過),您可能會遇到轉換錯誤。 它還假定這些字段都不為null 如果這些假設不正確,您/我們可以修改代碼。 如果您無法自己做到這一點,請告訴我有關問題,我們將竭盡所能。

暫無
暫無

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

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