【问题标题】:Is subquery the solution to this?子查询是解决这个问题的方法吗?
【发布时间】:2013-04-09 22:47:39
【问题描述】:

这是表结构和一些示例数据:

pID.....month.....year

27 .....3    .....2008

27 .....12   .....2012

31 .....6    .....2008

99 .....1    .....2006

42 .....1    .....2009

pID 是 practiceID,月份和年份代表他们输入数据的日期。我需要获取 2012 年 10 月、2012 年 11 月、2012 年 12 月等第一次输入数据的实践数量。 我在 2012 年 10 月尝试了以下查询:

SELECT *
FROM
    IPIPKDIS
where
    practiceID NOT IN (
         SELECT practiceID
         from
             IPIPKDIS
         where
             year < 2012 and month < 10
    )
    and year = 2012
    and month = 10
    and measureCatRecID = 2
ORDER BY year, month;

但它比 10/2012 少了几个月和一年。

如果我单独运行查询(而不是子查询),它们都可以正常工作。

有什么想法吗?

【问题讨论】:

  • 请说明“2012年10月首次输入数据”
  • 如果去掉那个子查询,结果如何?

标签: mysql database subquery


【解决方案1】:

此摘要查询将为每个 practiceID 值生成表中的第一个(最小)日期。

SELECT practiceID,
       MIN(STR_TO_DATE( CONCAT(year, ' ', month), '%Y %m')) first_date 
  FROM IPIPKDIS 
 GROUP BY practiceID

如果您想检索第一个报告月份的整行,您可以执行如下嵌套查询:

SELECT *
  FROM IPIPKDIS I
  JOIN (
    SELECT practiceID,
           MIN(STR_TO_DATE( CONCAT(year, ' ', month), '%Y %m')) first_date 
      FROM IPIPKDIS 
     GROUP BY practiceID
       ) first ON (    first.practiceID = I.practiceID 
               AND STR_TO_DATE( CONCAT(I.year, ' ', I.month), '%Y %m') = first.first_date)

第二个查询的技巧是使用 JOIN 从表中仅提取第一个月的行。我们使用日期算术来进行日期比较。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多