我的数据库看起来像这样
Value | Date | parent_id
y | 2019-01-01 | 1
n | 2019-01-02 | 1
n | 2019-01-03 | 1
我想编写一个查询,该查询将查找具有parent_id = 1
和value = '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。
答案 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'
窗口功能通常比相关子查询更有效。
查询工作如下。
首先,它遍历表,并使用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
。