我有两张桌子。表A和表B.它们都有日期字段。我需要比较这些字段并得到一个表C,表A和表B之间的日期越来越少或相等,考虑到表A是主要的。
背景信息:我在表A中列出了产品的到期时间,以及工作日的表B中。用户可以在确定时更新表B. 日期不应被视为“营业日”。然后删除 表B中的日期然后转到表A以更新所有产品 在该日期登记的过期并将其分配给 上一个工作日。所以在我的情况下,我正在创建表C,其中 包含表A的Id和工作日期小于或等于 提及日期。然后我将进行相应的更新。
IF OBJECT_ID('tempdb..#tmpA') IS NOT NULL DROP TABLE #tmpA
IF OBJECT_ID('tempdb..#tmpB') IS NOT NULL DROP TABLE #tmpB
CREATE TABLE #tmpA(Id INT IDENTITY(100,1),Fecha date)
INSERT INTO #tmpA(Fecha)
VALUES
('20170101'),('20171003'),('20170504'),('2017-09-01')
SELECT * FROM #tmpA
Id Fecha
----------- ----------
100 2017-01-01
101 2017-10-03
102 2017-05-04
103 2017-09-01
CREATE TABLE #tmpB(Id INT IDENTITY(1,4),Fecha date)
INSERT INTO #tmpB(Fecha)
VALUES
('20170101'),('20171001'),('20170504')
SELECT * FROM #tmpB
Id Fecha
----------- ----------
1 2017-01-01
5 2017-10-01
9 2017-05-04
我想得到这个结果(表A中的记录数相同):
Id Fecha
----------- ----------
100 2017-01-01
101 2017-10-01 --> **this row is less than 2017-10-03**
102 2017-05-04
103 2017-05-04 --> **this row is less than 2017-09-01**
我尝试构建一些没有结果的查询,
IF OBJECT_ID('tempdb..#tmpC') IS NOT NULL DROP TABLE #tmpC
SELECT A.* INTO #tmpC FROM #tmpA A LEFT JOIN #tmpB B ON A.Fecha = B.Fecha WHERE B.Fecha IS NULL
SELECT * FROM #tmpC
SELECT *
FROM #tmpA A INNER JOIN
(
SELECT *
FROM #tmpC
GROUP BY id, Fecha
) AS Q ON MAX(Q.Fecha) <= A.Fecha
更新:
注意。 Id列只是一个标识,但并不意味着它应该是相关的。重要的是日期。
此致
答案 0 :(得分:1)
虽然我不确定这是否可以很好地扩展(如果你有超过10万行),这将带回你想要的结果。
理论上,以 可以扩展的方式执行此操作的正确方法是使用RANK()并将这两个表连接在一起的视图,尽管这是快捷方便。请尝试这个,如果符合您的要求,请告诉我
为了您的启发,我已将两个日期留在那里,以便您能够比较它们。
SELECT
A.ID
,A.FECHA OLDDATE
,B.FECHA CORRECTDATE
FROM #TMPA A
LEFT OUTER JOIN #TMPB B ON 1=1
WHERE 1=1
AND B.FECHA = (
SELECT MAX(FECHA)
FROM #TMPB
WHERE FECHA <= A.FECHA)
答案 1 :(得分:0)
这是你想要的吗?
select a.id,
(case when b.fecha < a.fecha then b.fecha else a.fecha end) as fecha
from #tmpA a left join
#tmpB b
on a.id = b.id;
答案 2 :(得分:0)
你可以通过联盟全部获得最低分数
select id, min(fecha) from (
select * from #tmpA
union all
select * from #tmpB
) a
group by a.id