2015-07-05 97 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); 
相关问题