【问题标题】:Select Distinct Records for min date为最小日期选择不同的记录
【发布时间】:2010-11-12 15:28:00
【问题描述】:

我有一个查询,我需要从表中选择所有不同的 ID,还需要只选择 min(date),以便我获得第一个插入的记录,而不是所有日期的 ID。

基本上这就是我要找的 -

表 1 ||表 2-
身份证||身份证日期

1 || 1 2010 年 11 月 11 日
1 || 1 2010 年 10 月 11 日
3 || 3 2010 年 12 月 1 日
4 || 4 01/01/2010
4 || 4 2010 年 2 月 1 日

所以我需要从表 2(table1.ID=table2.ID) 中获取所有记录,其中包含该 ID 的最小日期

这里的结果是
1 2010 年 10 月 11 日
3 2010 年 12 月 1 日
4 2010 年 1 月 1 日

这是我的查询

select u.firstName,u.lastName ,count(*) as theCount
from tbl_appts_change_log c,tbl_appts a, tbl_users u
where  c.appt_id=a.ID
and c.user_id=u.userID
 and c.appt_id in ( select  c.appt_id,min(c.date) from tbl_appts_change_log c, tbl_appts a
                        where  c.appt_id=a.ID
                        and a.satellite_id='160' GROUP BY c.appt_id)    
group by u.firstName,u.lastName
 order by count(*) desc,u.firstName,u.lastName

【问题讨论】:

  • 您能发布您的架构吗?我不明白你想用这个查询做什么......
  • 我无法使用聚合函数和子查询的第二列......它给出了各种错误......
  • @Santosh,尝试用简单的英语重写您真正需要的内容,而不使用诸如 distinct 和 min 之类的 SQL 关键字
  • 我已经重写了我正在寻找的内容..希望对您有所帮助...我也找到了解决方案,看看我使用的 Leslie 的解决方案...
  • 非常感谢大家的帮助......

标签: sql sql-server


【解决方案1】:

也许:

select u.firstName,u.lastName ,count(*) as theCount
from tbl_appts_change_log c
INNER JOIN tbl_appts a on c.appt_id=a.ID
INNER JOIN tbl_users u on c.user_id=u.userID
INNER JOIN ( select  c.appt_id,min(c.date) as LastDate 
    from tbl_appts_change_log c 
    INNER JOIN  tbl_appts a on  c.appt_id=a.ID
    Where a.satellite_id='160' GROUP BY c.appt_id) d
on c.appt_id = d.appt_id and c.date = d.LastDate
group by u.firstName,u.lastName
order by count(*) desc,u.firstName,u.lastName

【讨论】:

  • 嗨 leslie..感谢那个 SQL...它工作正常...我尝试过 Group by 但没有尝试下一部分!!!
  • 太棒了!那么你应该接受它作为答案!很高兴能够提供帮助!
【解决方案2】:

我忽略了您的代码,因为它似乎与您在问题中描述的情况完全不同,即 Table1 和 Table2。如果您想要的只是每个 ID 的最短日期,那么您只需要

SELECT T1.ID,   MIN(T2.Date)
FROM Table1 T1
    JOIN Table2 T2 ON T1.ID = T2.ID
GROUP BY T1.ID

但我猜你真正想要的是这样的东西?

Table 1 || Table 2-
ID || ID Date Desc

1 || 1 11/11/2010 AAA
1 || 1 10/11/2010 BBB
3 || 3 12/01/2010 CCC
4 || 4 01/01/2010 DDD
4 || 4 02/01/2010 EEE

以及预期的结果

1 10/11/2010 BBB
3 12/01/2010 CCC
4 01/01/2010 DDD

这比仅仅做一个 group by 稍微复杂一些,有两种方法可以解决它。您可以尝试两种方法,看看哪一种效果最好

方法一:使用行号

;WITH ResultCTE AS
(
    SELECT T2.ID, T2.Date, T2.Desc,
       RowNumber = ROW_NUMBER() OVER(PARTITION BY T2.ID ORDER BY T2.Date ASC)   
    FROM Table1 T1
          JOIN Table2 T2 ON T1.ID = T2.ID
)    
SELECT ID, Date, Desc
FROM ResultCTE    
WHERE RowNumber = 1

方法二:嵌套查询

;WITH ResultCTE AS
(
    SELECT T2.ID, MIN(T2.Date) AS Date
    FROM Table1 T1
        JOIN Table2 T2 ON T1.ID = T2.ID
    GROUP BY T2.ID
)
SELECT T.ID, T.Date, T.Desc
FROM Table2 T
    JOIN ResultCTE R
        ON R.ID = T.ID AND R.Date = T.Date

【讨论】:

    【解决方案3】:
    SELECT u.firstName,
      u.lastName ,
      COUNT(*) AS theCount
    FROM tbl_appts_change_log c,
      tbl_appts a,
      tbl_users u
    WHERE c.appt_id=a.ID
    AND c.user_id  =u.userID
    AND a.satellite_id = '160'
    AND c.date = (SELECT MIN(ci.date)
      FROM tbl_appts_change_log ci,
        tbl_appts ai
      WHERE ci.appt_id   = ai.ID
      AND ci.appt_id = c.appt_id
      AND ai.satellite_id= a.satellite_id
      )
    GROUP BY u.firstName,
      u.lastName
    ORDER BY COUNT(*) DESC,
      u.firstName,
      u.lastName
    

    【讨论】:

      【解决方案4】:
      select u.firstName,u.lastName,count(*) as theCount,cm.MinDate
      from ( 
          select c.appt_id,min(c.date) as MinDate
          from tbl_appts_change_log c, tbl_appts a 
          where c.appt_id=a.ID 
              and a.satellite_id='160' 
          GROUP BY c.appt_id
          ) cm 
      inner join tbl_appts_change_log c on cm.appt_id = c.appt_id and cm.MinDate = c.date 
      inner join tbl_appts a on c.appt_id=a.ID 
      inner join tbl_users u on c.user_id=u.userID 
      group by u.firstName,u.lastName 
      order by count(*) desc,u.firstName,u.lastName
      

      【讨论】:

        【解决方案5】:

        如果你要找的是-

        表 1 ||表 2-
        身份证||身份证日期

        1 || 1 2010 年 11 月 11 日
        1 || 1 2010 年 10 月 11 日
        3 || 3 2010 年 12 月 1 日
        4 || 4 01/01/2010
        4 || 4 2010 年 2 月 1 日

        试试这个:

        SELECT DISTINCT i1.id, i2.dt
        FROM Table1 i1 JOIN (SELECT id, min(date) dt FROM Table2 GROUP BY id) i2
        ON i1.id=i2.id
        

        【讨论】:

          【解决方案6】:

          这就是你所追求的吗?

          select u.firstName,u.lastName ,count(*) as theCount
          from tbl_appts_change_log c,tbl_appts a, tbl_users u
          where  c.appt_id=a.ID
          and c.user_id=u.userID
          and a.satellite_id = '160'
          and c.date = (
            select min(date) 
            from tbl_appts_change_log c, tbl_appts a
            where c.appt_id = a.id
            and a.satellite_id = '160'
          )
          group by u.firstName,u.lastName
          order by count(*) desc,u.firstName,u.lastName
          

          【讨论】:

          • 我需要为最短日期选择 ID
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多