sqlite在2列上同时选择'max'值

时间:2017-01-20 20:12:14

标签: python sql sqlite

这是我的sqlite表:

CREATE TABLE TEST 
(ID             INTEGER PRIMARY KEY   NOT NULL,
 DAY            DATE                  NOT NULL,
 HOUR           TIME                  NOT NULL,
 VALUE          REAL                  NOT NULL,
 COEF           REAL)

我的价值观:

║   DAY         ║  HOUR    ║  VALUE     ║  COEF ║  
║  '2016-01-19' ║  '16:00' ║  '11240.0' ║  '0.5'║  
║  '2016-01-19' ║  '18:00' ║  '11244.0' ║  '0.2'║  
║  '2016-01-22' ║  '20:30' ║  '11254.0' ║  '0.6'║  
║  '2016-01-23' ║  '12:25' ║  '11256.0' ║  '0.8'║  
║  '2016-01-23' ║  '14:40' ║  '11257.0' ║  '0.3'║  
║  '2016-01-24' ║  '09:40' ║  '11259.0' ║  '0.4'║  
║  '2016-01-24' ║  '19:45' ║  '11260.0' ║  '0.5'║  
║  '2016-01-25' ║  '18:50' ║  '11263.0' ║  '0.6'║  
║  '2016-01-26' ║  '18:40' ║  '11266.0' ║  '0.1'║  
║  '2016-01-31' ║  '20:00' ║  '11278.0' ║  '0.9'║  
║  '2016-01-31' ║  '22:00' ║  '11280.0' ║  '0.3'║  
║  '2016-02-03' ║  '21:40' ║  '11285.0' ║  '0.4'║  
║  '2016-02-05' ║  '10:10' ║  '11290.0' ║  '0.2'║  

我想根据'Max(DAY)'的最新'HOUR'为每个'WeekNumber'选择'Max(DAY)'值。

到目前为止,我有这个要求:

SELECT strftime('%Y-%m-%d', DAY, 'weekday 0') WeekNumber, MAX(DAY), HOUR, 
 MAX(VALUE), MAX(VALUE)-MIN(VALUE), COEF  
FROM TEST  
WHERE DAY >= '2016-01-19' AND DAY <= '2017-03-31'  
GROUP BY WeekNumber  
ORDER BY WeekNumber ASC 

该查询获得该结果:

║ "2016-01-24" ║ "2016-01-24" ║ "16:00" ║ "11260.0" ║ "20.0" ║ "0.5" ║ 
║ "2016-01-31" ║ "2016-01-31" ║ "18:50" ║ "11280.0" ║ "17.0" ║ "0.6" ║ 
║ "2016-02-07" ║ "2016-02-05" ║ "21:40" ║ "11290.0" ║  "5.0" ║ "0.4" ║ 

在这个结果中,在线'2016-01-24'''HOUR'栏的价值为'16:00',但我需要获得'19:45'......我需要获得最新的一小时上周这一天。

(结果行'2016-01-31'同样的事情,应该是'HOUR = 22:00')

我如何继续处理这项工作的请求?

(我不能在请求中使用'Max(HOUR)',因为它会产生本周最高的小时数,但不会出现我想要的一周最后一天的那一小时)

感谢您的任何想法

3 个答案:

答案 0 :(得分:0)

当然,这里是'插入':

插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-19','16:00','11240.0','0.5');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-19','18:00','11244.0','0.2');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-22','20:30','11254.0','0.6');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-23','12:25','11256.0','0.8');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-23','14:40','11257.0','0.3');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-24','09:40','11259.0','0.4');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-24','19:45','11260.0','0.5');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-25','18:50','11263.0','0.6');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-26','18:40','11266.0','0.1');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-31','20:00','11278.0','0.9');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-01-31','22:00','11280.0','0.3');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-02-03','21:40','11285.0','0.4');
插入测试(ID,DAY,HOUR,VALUE,COEF)值(NULL,'2016-02-05','10:10','11290.0','0.2');

答案 1 :(得分:0)

一种解决方案是每天制作一个名为MAXH的辅助表,最大小时数。 仅在查询期间存在的临时表是使用WITH创建的,如下所示:

with
maxh as (select day, max(hour) max_hour from test group by day),
result as (
  select
    strftime('%Y-%m-%d', day, 'weekday 0') weeknumber,
    max(day)                               max_day,
    max(value)                             max_value,
    max(value)-min(value)                  diff,
                                           coef
  from test  
  where day between '2016-01-19' and '2017-03-31'
  group by weeknumber
)
select
  weeknumber,
  max_day,
  (select max_hour from maxh where day=max_day) max_hour_that_day,
  max_value,
  diff,
  coef
from result order by 1;

测试表上的结果:

2016-01-24|2016-01-24|19:45|11260.0|20.0|0.5
2016-01-31|2016-01-31|22:00|11280.0|17.0|0.6
2016-02-07|2016-02-05|10:10|11290.0|5.0|0.4

答案 2 :(得分:0)

感谢您的回复,确实有效。

但与此同时,我也找到了另一种解决方案:

  

SELECT strftime('%Y-%m-%d',TEST.DAY,'weekday 0')WeekNumber,
MAX(TEST.DAY)AS MAXDAY,t1.MAXHOUR,MAX(TEST.VALUE ),MAX(TEST.VALUE)-MIN(TEST.VALUE),TEST.COEF

  从测试,(选择日,最大(小时)作为测试组每天最多)作为t1

  GROUP BY WeekNumber,t1.DAY
  有t1.DAY = MAXDAY
  AND TEST.DAY&gt; ='2016-01-19'AND TEST.DAY&lt; ='2017-03-31'

再次感谢您的帮助!