sql-选择与其他行中的值进行比较的行

时间:2019-02-24 22:35:08

标签: sql sqlite

我的数据库看起来像这样

Value | Date     | parent_id
 y    | 2019-01-01 | 1
 n    | 2019-01-02 | 1
 n    | 2019-01-03 | 1

我想编写一个查询,该查询将查找具有parent_id = 1value = 'y'的行,并针对具有parent_id=1'的其他行进行评估,但将检查以确保date大于其行的日期。

因此在这种情况下,它不会返回任何内容。

如果数据如下:

Value | Date     | parent_id
 y    | 2019-01-04 | 1
 n    | 2019-01-02 | 1
 n    | 2019-01-03 | 1

然后它将返回第一行。

如果有任何含义,我正在使用SQLite。

3 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS:

select * from tablename t
where 
  parent_id = 1 and value = 'y'
  and not exists (
    select 1 from tablename 
    where parent_id = t.parent_id
    and date > t.date
  )

请参见demo
建议:由于使用的是 SQLite ,因此应考虑将Date列的格式更改为YYYY-MM-DD,以便具有可比性。

答案 1 :(得分:1)

对于SQLite> = 3.25,只需使用window function ROW_NUMBER()即可:

SELECT * FROM (
    SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.parent_id ORDER BY t.date DESC) rn
    FROM mytable t
) x WHERE rn = 1 AND parent_id = 1 AND value = 'y'

窗口功能通常比相关子查询更有效。

Demo on DB Fiddle


查询工作如下。

首先,它遍历表,并使用ROW_NUMBER()为具有相同parent_id且记录编号最高的date的记录组中的每个记录分配一个等级。 1。您可以运行子查询以查看其实际返回的内容(当有多个parent_id时,它会变得更加有趣):

SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.parent_id ORDER BY t.date DESC) rn
FROM mytable t

然后,剩下要做的就是在目标parent_id上进行过滤,选择行号为1的记录(即为此date具有最高parent_id的记录),并确保它具有value = 'y'

答案 2 :(得分:0)

另一种方法只是寻找最后一行,看是否符合您的条件:

            if (doc.Bookmarks.Exists("TrackingPixel"))
            {
                object oBookMark = "TrackingPixel";
                object newText = @"https://www.remotelocation.com/trackingpixel/secretcode";

                Range rng = doc.Bookmarks.get_Item(ref oBookMark).Range;
                rng.Select();

                rng.Fields.Add(
                    Range: rng,
                    Type: WdFieldType.wdFieldIncludePicture,
                    Text: newText,
                    PreserveFormatting: true
                    );

            }

这将检查带有select t.* from (select t.* from t where t.parent_id = 1 order by t.date desc limit 1 ) t where value = 'y'; 的最后一行的值为parent_id = 1