我们需要向我们的EventVenue表中添加顺序,这是通过添加一个int字段来存储EventVenue的顺序来完成的。排序基于父事件的ID和事件的VenueGrouping。
如果VenueGrouping为false,则EventVenues将按顺序排序。但是,如果为真,则来自同一个父事件的同一事件的EventVenues将具有相同的排序。例如,假设我们已经按事件过滤了
EVID | VenueID | Not Grouped | Grouped
1 | 1 | 1 | 1
2 | 2 | 2 | 2
3 | 2 | 3 | 2
4 | 3 | 4 | 3问题是分组何时更改。我需要一些SQL来适当地更新活动的地点顺序,但是我发现我的头脑很难理解它,特别是当我从未分组到分组而不留下空白的时候。
我认为它需要像下面这样的if语句,但是如果一个更有效/更干燥的解决方案是合适的,那么更好:
-- Changing from Ungrouped to Grouped
IF @OldGrouping=0 AND @NewGrouping=1
BEGIN
UPDATE EventVenues SET Ordering=...
END
-- Changing from Grouped to Ungrouped
ELSE IF @OldGrouping=1 AND @NewGrouping=0
BEGIN
UPDATE EventVenues SET Ordering=...
END任何帮助都很感激。
根据请求,更多的示例数据:对格式化感到恼火,因此对标题使用了一个键:a= EventVenueID,B= VenueID,C=原始排序,D=更新排序
从未分组更新到分组
A-B
从分组更新到未分组
A-B
发布于 2009-11-10 16:29:10
WITH rows AS
(
SELECT e.*,
ROW_NUMBER() OVER (ORDER BY evid) AS rn,
DENSE_RANK() OVER (ORDER BY venueid) AS dr
FROM EventVenues e
)
UPDATE rows
SET Ungrouped = rn,
Grouped = dr更新:
如果我正确理解,Ordering是一个列,您可以根据某些外部参数(而不是存储在DB中)来更新它。
从未分组更新到分组更新:
WITH rows AS
(
SELECT e.*,
DENSE_RANK() OVER (ORDER BY VenueID DESC) AS dr
FROM EventVenues e
)
UPDATE rows
SET Ordering = dr这将以降序的方式更新Ordering,将相同的命令分配给相同的VenueID。
从分组更新到未分组更新:
WITH rows AS
(
SELECT e.*,
ROW_NUMBER() OVER (ORDER BY evid DESC) AS rn
FROM EventVenues e
)
UPDATE rows
SET Ordering = rn这将按降序更新Ordering。
https://stackoverflow.com/questions/1709206
复制相似问题