2015-07-05 193 views
1

我有這個查詢,它返回字段的最小日期值。同時選擇字段的最短日期和最大日期

SELECT sa.ContentID, SA.MSISDN, sa.DateRegistered AS minDate, sa.DateRegistered AS maxDate 
FROM sms.dbo.SubscriptionsArchive AS sa 
INNER JOIN (SELECT MSISDN, MIN(DateRegistered) AS mindate 
      FROM sms.dbo.SubscriptionsArchive 
      GROUP BY MSISDN) mysa 
ON sa.MSISDN = mysa.MSISDN AND sa.DateRegistered = mysa.mindate 

它的輸出是

enter image description here

但我想除了顯示在同一日期的最大日期值以及到最小日期。我如何實現這一目標?

+0

你的問題標記爲「MySQL的」,但語法建議的SQL Server。請適當標記問題。 –

回答

2

雖然它可能是很有誘惑力使用第二子查詢聯接,以獲得MAX(),並再次MSISDN的最大日加入,你應該能夠通過添加MAX(DateRegistered)到現有的子查詢並添加OR來實現它條件在聯接的ON子句中加入MSISDN,mindateMSISDN,maxdate

SELECT 
    sa.ContentID, 
    SA.MSISDN, 
    -- Use the join's dates by alias in the SELECT 
    mysa.mindate, 
    mysa.maxdate 
FROM 
    sms.dbo.SubscriptionsArchive AS sa 
    INNER JOIN (
    SELECT 
     MSISDN, 
     MIN(DateRegistered) AS mindate, 
     -- Add the max date 
     MAX(DateRegistered) AS maxdate, 
    FROM sms.dbo.SubscriptionsArchive 
    GROUP BY MSISDN 
) mysa 
    -- Join on either a mindate or maxdate match 
    ON (sa.MSISDN = mysa.MSISDN AND sa.DateRegistered = mysa.mindate) 
     OR (sa.MSISDN = mysa.MSISDN AND sa.DateRegistered = mysa.maxdate) 

我注意到你這個標記爲dbo真的建議你使用的是MS SQL服務器。如果這是真的,那麼你可以使用公用表表達式而不是子查詢連接。

-- Define the subquery as a CTE instead 
WITH mysa AS (
SELECT 
    MSISDN, 
    MIN(DateRegistered) AS mindate, 
    -- Add the max date 
    MAX(DateRegistered) AS maxdate, 
    FROM sms.dbo.SubscriptionsArchive 
    GROUP BY MSISDN 
); 

SELECT 
    sa.ContentID, 
    SA.MSISDN, 
    -- Use the join's dates by alias in the SELECT 
    mysa.mindate, 
    mysa.maxdate 
FROM sms.dbo.SubscriptionsArchive AS sa 
-- Join on the CTE 
INNER JOIN mysa 
    ON (sa.MSISDN = mysa.MSISDN AND sa.DateRegistered = mysa.mindate) 
    OR (sa.MSISDN = mysa.MSISDN AND sa.DateRegistered = mysa.maxdate) 
0

您的語法建議SQL Server。如果是的話,我會建議窗口功能:

SELECT sa.ContentID, SA.MSISDN, sa.DateRegistered AS minDate, sa.DateRegistered AS maxDate 
FROM (SELECT sa.*, 
      MIN(DateRegistered) OVER (PARITION BY sa.MSISDN) as mindr, 
      MAX(DateRegistered) OVER (PARITION BY sa.MSISDN) as maxdr 
     FROM sms.dbo.SubscriptionsArchive sa 
    ) sa 
WHERE sa.DateRegistered IN (mindr, maxdr); 
相關問題