我有像
这样的表中的数据+----+------------+------+
| Id | data_date | data |
+----+------------+------+
| 1 | 01/01/2017 | 1 |
| 1 | 01/02/2017 | 0 |
| 1 | 01/03/2017 | 0 |
| 1 | 01/04/2017 | 0 |
| 2 | 01/02/2017 | 0 |
| 2 | 01/03/2017 | 0 |
| 2 | 01/04/2017 | 1 |
| 2 | 01/05/2017 | 1 |
+----+------------+------+
数据列只有值0和1
我怎样才能获得最后几天连续相同的数据类型,即每个ID的“0”或“1”
+----+-----------+-----------------+
| Id | data_Type | Last_Data_Count |
+----+-----------+-----------------+
| 1 | 0 | 3 |
| 2 | 1 | 2 |
+----+-----------+-----------------+
答案 0 :(得分:0)
Oracle查询:
SELECT id,
MAX( last_data ) AS data_type,
COUNT(*) AS last_data_count
FROM (
SELECT d.*,
MAX ( CASE WHEN data <> last_data THEN data_date END )
OVER ( PARTITION BY id ) AS last_date
FROM (
SELECT d.*,
MAX( data ) KEEP ( DENSE_RANK LAST ORDER BY data_date )
OVER ( PARTITION BY id ) AS last_data
FROM data d
) d
)
WHERE data_date > last_date
GROUP BY id;
答案 1 :(得分:0)
假设您需要data
max(data_date)
id
每select t3.id
,max(data) as data_type
,count(data) as last_data_count
from table t3
where exists
(select 1 from Table t1
where exists
(select 1 from table t2
where t1.id=t2.id
group by t2.id
having t1.data_date=max(t2.data_date)
)
and t1.id=t3.id and t1.data=t3.data
)
group by t3.id
;
,您可以试试这个。它应该适用于几乎所有的RDBMS。
<强> Rexter Sample for MYSQL 强>
exists
说明:内部id
用于根据max(date)
获取每个exists
的最后一次data_date。现在要计算,我使用外id
来匹配data
和group by
,然后id
var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});
// This should load object with attributes
leadBean.fetch();
// Here were my attributes filled in with proper values including name
console.log(leadBean);
// Printed "undefined"
console.log(leadBean.attributes.name);
来计算。
答案 2 :(得分:0)
这可以通过使用Tabibitosan在 Oracle 中轻松获得,然后将结果分组,就像这样(注意:我假设您的意思是“连续几天”表示连续行,而不是连续的日期):
WITH sample_data AS (SELECT 1 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
SELECT 1 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 1 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 1 ID, to_date('01/04/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 2 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 2 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 2 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
SELECT 2 ID, to_date('01/04/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
SELECT 3 ID, to_date('01/01/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 3 ID, to_date('01/02/2017', 'dd/mm/yyyy') data_date, 1 DATA FROM dual UNION ALL
SELECT 3 ID, to_date('01/03/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual UNION ALL
SELECT 3 ID, to_date('01/05/2017', 'dd/mm/yyyy') data_date, 0 DATA FROM dual)
-- end of mimicking data in a table called "sample_data"
-- see below for the main SQL query:
SELECT ID,
DATA,
COUNT(*) last_data_count
FROM (SELECT ID,
data_date,
DATA,
MAX(data_date) OVER (PARTITION BY ID) max_data_date,
row_number() OVER (PARTITION BY ID ORDER BY data_date)
- row_number() OVER (PARTITION BY ID, DATA ORDER BY data_date) grp
FROM sample_data)
GROUP BY ID,
DATA,
grp,
max_data_date
HAVING max_data_date = MAX(data_date);
ID DATA LAST_DATA_COUNT
---------- ---------- ---------------
1 0 3
2 1 2
3 0 2
tabibitosan部分(即row_number() over (<overall set of data>) - row_number() over (<subset of data>)
)为每组连续行创建一个组号(我指的是按指定顺序彼此相邻的行 - *不是*具有连续日期的行)在数据列中具有相同的值。
获得此功能后,可以轻松找到每组连续行的计数。但是,由于您在最新计数之后,我使用MAX()
分析函数来查找每个id的最新data_date。
然后,我们可以比较每组连续行的max data_date,并使用它来查找与id的max data_date匹配的连续行集(我们在having
子句中执行)。瞧!