SQL查询最后连续相同的数据

时间:2017-06-01 09:16:44

标签: mysql sql oracle

我有像

这样的表中的数据
+----+------------+------+
| 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 |
+----+-----------+-----------------+

3 个答案:

答案 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) idselect 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来匹配datagroup 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子句中执行)。瞧!