【问题标题】:SQL for following scenario以下场景的 SQL
【发布时间】:2013-01-14 11:16:25
【问题描述】:

我在数据库中有以下两个表。一张表是person表,另一张表是Entry表,entry表记录的是一个部门的人员入口

人员表

    Person                  
Person_ID   Person_NIC  Person_Name Person_Last_Name    Person_Age  State
1           121212          ABC         BCD              12         ACTIVE
2           212121          ABB         BBB              13         NONACTIVE
3           111111          BBB         CCC              14         ACTIVE

条目表

ENTRY           
Entry_ID  Person_ID Entry_Escort    Entry_Date  
1         1           David         20121210    
2         1           David         20130110    
3         1           David         20130111    
4         1           David         20130112    
5         1           David     20130113    
6         2           David     20121210    
7         2           David     20130110    
8         2           David     20130111    
9         2           David     20130112    
10        2           David     20130113    

我必须为以下场景编写 sql。我需要为 1 月份在数据库中不活跃的人找到最后进入日期。谁能帮我查询。提前感谢您的帮助。

【问题讨论】:

  • 问题中缺少条目表结构..
  • 我正在尝试添加,但 stackoverflow 没有显示图像
  • 如何在与人相关的条目中?那张桌子上有person_id 吗?或entry_id 映射到person_nic
  • 为什么不向我们展示 sql 中的 create/insert 以及一些示例数据 :) 最好根据示例数据表明您的预期结果。
  • 您仍然在条目表中缺少一些日期。条目和人员之间没有关系...

标签: mysql sql oracle plsql


【解决方案1】:

这应该像这样简单:

SELECT p.Person_ID, MAX(e.Entry_Date) as MaxEntryDate
FROM 
 Person p 
 INNER JOIN Entry e
   ON p.Person_NIC = e.EntryID
WHERE p.State = 'NONACTIVE'
   AND Entry_Date  BETWEEN 20130101 AND 20130131
GROUP BY p.Person_ID

【讨论】:

  • 我需要找到一月份非活跃人员的最后一个条目
【解决方案2】:

试试这个::

Select 
p.*,
MAX(Entry_Date) 
from 
persons p
inner join entry ep on (p.Person_NIC=ep.Entry_ID)

where State='NONACTIVE'
GROUP BY ep.Entry_ID

【讨论】:

    【解决方案3】:

    这应该可以满足您的需要:

    select p.person_id, p.person_nic, p.Person_Name, p.Person_Last_Name,
           max(e.entry_date) max_entry_date
     from person p
          inner join entry e
                  on e.entry_id = p.person_nic
    where p.state = 'NONACTIVE'
    group by p.person_id, p.person_nic, p.Person_Name, p.Person_Last_Name
    

    附言将 AGE 存储在数据库表中并不好,因为您必须不断更新它。最好动态存储出生日期和计算年龄(或在视图/虚拟列中)

    【讨论】:

      【解决方案4】:

      请尝试一下:根据需要在一月份更新...

      SQLFIDDLE DEMO

         Select p.person_id, p.person_nic,
         p.Person_Name,
         p.Person_Last_Name,max(e.entry_date )
         from person p
         inner join entry e 
         on (p.Person_id = e.person_id)
         where p.State='NONACTIVE'
         and month(e.entry_date) = 1
         GROUP BY p.person_nic, e.Entry_ID
         ;
      
      | PERSON_ID | PERSON_NIC | PERSON_NAME | PERSON_LAST_NAME |MAX(E.ENTRY_DATE ) |
      ---------------------------------------------------------------------------------
      |         2 |     212121 |         ABB |              BBB | January, 13 2013 |
      

      【讨论】:

      • @kltis 检查演示,我将一些示例数据更改为具有february 以及触发您后面提到的条件。如果您使用month(),那么它比将任何静态日期添加到查询中更具动态性;)
      • @FlorinGhita 在 uesr 开始处于非活动状态时是否在任何地方定义非活动状态?
      • 你能告诉我为什么你把 p.person_nic 和 e.entry_id 放在 GROUP BY 部分
      • @Kltis 您实际上不需要 entry_id 在您的情况下,但是如果该人两次输入相同的内容,这意味着他将有两个条目 ID,那么最大日期是相同的,但它有两个条目ID...除非它不会显示它..
      猜你喜欢
      • 2014-10-23
      • 2021-07-21
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多