2017-01-20 2 views
0

にsimultanously '最大' の値を選択するSQLiteの私のsqliteのテーブルです:はここ2列

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'║ 

私は各 'WeekNumber' 'マックス(のために選択したいと思います(DAY) 'の最新の' HOUR 'に基づいて値を計算します。そのクエリは、その結果を取得

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年1月24日' 'HOUR' コラム'16時'の値になりますが、私は'19時45分 'を取得する必要があります...私はその特定の先週の日の最新の時間を取得する必要があります。

(「HOUR = 22時」あるべき結果ライン「2016年1月31日」に関する同じ事、)

私はその仕事を持っている要求を進めることができますか?

(私がしたいと、それは週に最高の時間をもたらしますが、週の最新の日のために誰ので、私は "マックス(HOUR)の要求に使用することはできません)

感謝16 '、TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL INTO

INSERT、 '2016年1月19日':任意のアイデアもちろん

+0

テストテーブルにデータを挿入するには、insert SQLを追加してください。 –

答えて

0

解決策の1つは、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 
0

のために、ここで '挿入' のとおりです。 00 '、' 11240.0 '、' 0.5 ');
VALUE(NULL、 '2016-01-19'、 '18:00'、 '11244.0'、 '0.2'); NULLを入力してください(ID、DAY、HOUR、VALUE、COEF)
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-22'、 '20:30'、 '11254.0'、 '0.6');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-23'、 '12:25'、 '11256.0'、 '0.8');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-23'、 '14:40'、 '11257.0'、 '0.3');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-24'、 '09:40'、 '11259.0'、 '0.4');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-24'、 '19:45'、 '11260.0'、 '0.5');
値(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)
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-01-31'、 '22:00'、 '11280.0'、 '0.3');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-02-03'、 '21:40'、 '11285.0'、 '0.4');
INSERT INTO TEST(ID、DAY、HOUR、VALUE、COEF)VALUES(NULL、 '2016-02-05'、 '10:10'、 '11290.0'、 '0.2');

+0

質問を編集するには、[編集]をクリックします。 –

0

おかげで、それは確かに動作します。

しかし、その間に、私はまた、別の解決策を見つける:

SELECTのstrftime( '%Y-%m-%d' では、TEST.DAY、 '平日0')WeekNumber、
MAX(TESTを.DAY)MAX1.EXE MAXDAY、t1.MAXHOUR、MAX(TEST.VALUE)、MAX(TEST.VALUE)、MIN(TEST.VALUE)、TEST.COEF

テストから(選択日、最大(時間)MAXHOUR T1

GROUP BY WeekNumber、t1.DAY
がt1.DAY = MAXDAY
AND TEST.DAY> = '2016年1月19日' を持つものとしてTEST GROUP BY DAY)から、 AND TEST.DAY < = '2017-03-31'

もう一度お世話になります!