【问题标题】:Get max for each row between two dates?获取两个日期之间每一行的最大值?
【发布时间】:2018-04-30 12:57:02
【问题描述】:

在这里学习sql,遇到了挑战。

我有下表:

tbl <- data.frame(
   id_name = c("a", "a", "b", "c", "d", "f", "b", "c", "d", "f"),
   value = c(1, -1, 1, 1, 1, 1, -1, -1, -1, -1),
   score = c(1, 0, 1, 2, 3, 4, 3, 2, 1, 0),
   date = as.Date(c("2001-1-1", "2002-1-1", "2003-1-1", "2005-1-1", 
                    "2005-1-1", "2007-1-1", "2008-1-1", "2010-1-1", 
                    "2011-1-1", "2012-1-1"), "%Y-%m-%d")
                   )


+---------+-------+-------+-----------+
| id_name | value | score |   date    |
+---------+-------+-------+-----------+
| a       |     1 |     1 |  2001-1-1 |
|  a      |    -1 |     0 |  2002-1-1 |
|  b      |     1 |     1 |  2003-1-1 |
|  c      |     1 |     2 |  2005-1-1 |
|  d      |     1 |     3 |  2005-1-1 |
|  f      |     1 |     4 |  2007-1-1 |
|  b      |    -1 |     3 |  2008-1-1 |
|  c      |    -1 |     2 |  2010-1-1 |
|  d      |    -1 |     1 |  2011-1-1 |
|  f      |    -1 |     0 |  2012-1-1 |
+---------+-------+-------+-----------+

我的目标是:

对于每个 id_name,我想从当前行 = id_name(包括)的日期之间的 tbl 中获取最大分数的第一个日期(在决胜局的情况下)

例如,id_name 'a' 应该返回 '2001-1-1' 因为它的分数是 1 id_name 'b' 应该返回 '2007-1-1' 因为它的分数是 4:

+---------+----------+
| id_name |   date   |
+---------+----------+
| a       | 2001-1-1 |
| b       | 2007-1-1 |
+---------+----------+

这就是我目前所拥有的,

   sqldf("
  SELECT 
    id_name,
    date,
    score
  FROM
    tbl As d
  WHERE
    score = (
                        SELECT MAX(score)
                        FROM tbl As b
                        WHERE 
                          date >= (
                                        SELECT MIN(date)
                                        FROM tbl
                                        WHERE id_name = b.id_name
                          ) AND
                          date <= (
                                        SELECT MAX(date)
                                        FROM tbl
                                        WHERE id_name = b.id_name
                          )
    )
  ")

问题是它返回具有全局最大值的行,而与当前行值无关

谢谢!

【问题讨论】:

    标签: sql r sqlite sqldf


    【解决方案1】:

    我认为 WHERE 子句中的相关子查询将符合此处的要求:

    SELECT id_name, date
    FROM tbl as t1
    WHERE score = (SELECT max(score) FROM tbl WHERE id_name = t1.id_name)
    

    【讨论】:

    • 感谢 JNevill 的回复。它让我更接近,但并不完全在那里。例如,对于 id_name = 'b',它应该返回 '2007-1-1',因为这是得分最高并且介于第一个日期和最后一个日期之间的时间('2003-01-01' 和 '2008-01- 01') of id_name = 'b'
    • 我更新了上面的问题和我的尝试。如果还不清楚,请告诉我。谢谢。
    • 所以您正在寻找给定 id_name 的两个日期之间出现的任何记录的最高分数的日期?您的 id_name 是否只有 1 条记录或超过 2 条记录?
    • 另外,澄清一下这是一个sqlite数据库吗?我在标签中看到了它,但只是想确认一下,因为人们非常经常标记错误的 RDBMS,如果他们的问题和使用的 RDBMS 将在这里发挥重要作用,因为 LAG() 和其他窗口函数应该使这非常可行。
    • 对你的第一个问题是的,我正在使用 sqldf 包在 R 中执行此操作,所以它是 sqlite!
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 2019-12-29
    • 2017-06-13
    • 2014-12-19
    • 2017-03-16
    • 2018-04-14
    • 2019-11-02
    • 2018-01-11
    相关资源
    最近更新 更多