【发布时间】:2021-11-11 15:04:28
【问题描述】:
我有以下疑问:
SELECT
fs.FILOID currentfilo,
ISNULL(LEAD(af.FILOID) OVER (ORDER BY StartTransactionTimeUTC), fs.Next_FILOID) Nextfilo,
ISNULL(LAG(af.FILOID) OVER (ORDER BY StartTransactionTimeUTC), fs.Previous_FILOID) lf
FROM
[DataWarehouseCore].[DWC_FILOSummary] fs
JOIN
[AttendanceCore].[AC_FILO] af ON af.FILOID = fs.FILOID
WHERE
fs.Employee_ID = 15049
AND Client_ID = 306
返回以下结果:
currentfilo Nextfilo lf
----------------------------
5 2 NULL
2 3 5
3 6 2
6 7 3
7 1 6
1 NULL 7
如果传入了 ID 6,我只想查看 currentfilo 3, 6, 7 , 1。因此,与其返回结果集中的内容,不如只返回实际上基于日期字段的上一个和下一个记录.
这是一些数据示例,我希望看到的是父表:AC_FILO
FILOID ClientID EmployeeID StartTransactionTimeUTC
-----------------------------------------------------------
5 306 15049 2021-08-29 02:53:00.0000000
2 306 15049 2021-09-01 06:46:00.0000000
3 306 15049 2021-09-02 07:50:00.0000000
6 306 15049 2021-09-06 08:56:00.0000000
7 306 15049 2021-09-10 07:58:00.0000000
1 306 15049 2021-09-15 07:45:00.0000000
我想要在我的新表中是当前 FILOID 的有序列表,下一个 FILOID 和前一个 FILOID 是基于 StartTransactionTimeUTC
例如,当插入 FILOID 6 时,我希望查看前一个 FILOID 到 FILOID 6,然后是基于日期的所有正在进行的 FILOID!
例如我想看看
CurrentFilo NextFilo LastFilo
-----------------------------
3 6 2
6 7 3
7 1 6
1 NULL 7
【问题讨论】:
-
您需要使用子查询和
STRING_AGG来实现此目的,并且由于三角连接,此查询不太可能高效。 -
in the order they are in this table数据在表中没有订单,如果没有提供order by,数据库引擎将返回未排序的数据,所以你的方法是行不通的 -
在这个数据和这个结果集中,当你说“ID = 6”时,“ID”是什么。我对您的数据了解不够,无法在此处提供指导。我假设
FILOID但它存在于两个表中,并且存在于结果集中的所有三列中。这是该数据中的父/子关系吗?如果是这样,递归 CTE 将解决您的问题。
标签: sql sql-server join select