Mysql SQL:如何在SQL中找到每个组的最小值?

Mysql SQL:如何在SQL中找到每个组的最小值?,mysql,sql,Mysql,Sql,我有以下表格: 我要检索的是每个域的第一个最早日期 因此,输出应为: google 2005 08 31 facebook 2006 02 25 我尝试了以下查询,但它检索每个列的最小值: select domain, min(year), min(month), min(day) from snapshots group by domain 如前所述,您应该使用连接创建单个日期,然后选择最低值 select domain, MIN(CAST(CONCAT(`year`,

我有以下表格:

我要检索的是每个域的第一个最早日期

因此,输出应为:

google    2005  08  31
facebook  2006  02  25  
我尝试了以下查询,但它检索每个列的最小值:

select domain, min(year), min(month), min(day) from snapshots group by domain

如前所述,您应该使用连接创建单个日期,然后选择最低值

select domain, MIN(CAST(CONCAT(`year`, '-'`,month`,'-',`day`) AS DATE)) from snapshots group by domain

尚未对此进行测试,但这应该会给您一个想法。

您可以连接日期字段中的值,将它们转换为日期,然后选择最小日期。我希望在这种情况下,值为varchar:

SELECT domain, 
MIN(CAST(CONCAT(year,'-',month,'-',day) AS date)) 
FROM snapshots 
GROUP BY domain;
在MySQL中: 选择 领域 从年、月、日、%Y作为Y开始, 从年、月、日、%m作为m开始, 从_UNIXTIMEUNIX_TIMESTAMPMINCONCATyear,'-',月,'-',日,'%d'作为d 从…起 快照 分组 领域 ;
可能有更简单的解决方案,但您可以从年、月和日三列中创建日期类型的新列。然后按如下方式获取最小日期:

SELECT DISTINCT s.domain, s.year, s.month, s.day
FROM
(
  SELECT domain, year,month,day,
       STR_TO_DATE(CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00')) ,'%Y-%m-%d') AS FullDate
    FROM snapshots
) AS s
INNER JOIN
(
  SELECT domain, MIN(Fulldate) MinDate
  FROM
  (
    SELECT domain, year,month,day,
       STR_TO_DATE(CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00')) ,'%Y-%m-%d') AS FullDate
    FROM snapshots
  ) AS t
  GROUP BY domain
) AS t  ON t.MinDate = s.FullDate 
       AND t.Domain = s.Domain;
这将为您提供所需的确切结果:

|   domain | year | month | day |    MinDate |
|----------|------|-------|-----|------------|
|   google | 2005 |     8 |  31 | 2005-08-31 |
| facebook | 2006 |     2 |  25 | 2006-02-25 |

你能试试这个,让我知道,如果它解决了你的问题没有连接?如果需要,可以使用子查询使其更加健壮

CREATE TABLE domainDate(domain CHAR(25), `year` INT, `month` INT, `day` INT);

INSERT INTO domainDate VALUES
    ('google', 2007, 04, 15),
    ('google', 2005, 08, 31),
    ('google', 2005, 12, 01),
    ('facebook', 2006, 04, 15),
    ('facebook', 2006, 02, 25),
    ('facebook', 2008, 01, 01);

SET @VDomain := '';
SELECT domain, `year`, `month`, `day` FROM domainDate HAVING @VDomain != @VDomain := domain ORDER BY domain, `year` * 10000 + `month` * 100 + `day`;
谢谢


James

您可以尝试排名函数行数

CREATE TABLE domainDate(domain CHAR(25), [year] INT, [month] INT, [day] INT);

INSERT INTO domainDate VALUES
    ('google', 2007, 04, 15),
    ('google', 2005, 08, 31),
    ('google', 2005, 12, 01),
    ('facebook', 2006, 04, 15),
    ('facebook', 2006, 02, 25),
    ('facebook', 2008, 01, 01);

SELECT domain
    ,[year]
    ,[month]
    ,[day]
FROM 
(
    SELECT domain
        ,[year]
        ,[month]
        ,[day]
        ,ROW_NUMBER() OVER(PARTITION BY domain ORDER BY [year], [month], [day]) AS RN
    FROM domainDate
) t
WHERE RN = 1

您使用的是MySQL还是SQL Server?在连接之后,您需要将它们视为日期,并应用MIN函数。@GiorgosBetsos MySQLIf您可以将日期数据存储在日期类型列而不是分隔列中…是否有其他方法不连接?谢谢!串联确实简化了它。
CREATE TABLE domainDate(domain CHAR(25), [year] INT, [month] INT, [day] INT);

INSERT INTO domainDate VALUES
    ('google', 2007, 04, 15),
    ('google', 2005, 08, 31),
    ('google', 2005, 12, 01),
    ('facebook', 2006, 04, 15),
    ('facebook', 2006, 02, 25),
    ('facebook', 2008, 01, 01);

SELECT domain
    ,[year]
    ,[month]
    ,[day]
FROM 
(
    SELECT domain
        ,[year]
        ,[month]
        ,[day]
        ,ROW_NUMBER() OVER(PARTITION BY domain ORDER BY [year], [month], [day]) AS RN
    FROM domainDate
) t
WHERE RN = 1